2017-12-18 80 views
5

मैं ऐसा करना चाहते हैं:किसी विशिष्ट निर्माता के साथ एसटीएल प्राथमिकता_क्यू + तुलनित्र का उपयोग कैसे करें?

#include <queue> 
#include <set> 

class Comparator 
{ 
    public: 
    Comparator(SomeObject& rTool) : mrTools(rTool) {} 

    bool operator()(const std::string& a, const std::string& b) 
    { 
     return mrTools.doSomething(a,b); 
    } 

    private: 
    SomeObject& mrTools; 
} 

std::priority_queue<std::string, std::set<std::string>, Comparator> queue; 
//<- this doesn't compile 

मैं इस कतार संदर्भ यह निर्माता में की जरूरत के साथ उपलब्ध कराने के तुलनाकारी कैसे initalize कर सकते हैं?

उत्तर

1

इसका आपके Comparator के साथ कुछ भी नहीं है, और std::set के साथ सब कुछ करने के लिए SequenceContainer की आवश्यकताओं को पूरा नहीं करता है। आप front, push_back और pop_back, को लागू करने और iterator कि RandomAccessIterator

4

आप Comparator का एक उदाहरण प्रदान कर सकते हैं यह निर्माण करने के लिए कर रहे हैं के लिए vector उपयोग कर सकते हैं या deque, या अपने स्वयं SequenceContainer लिखते हैं, यह सुनिश्चित करते हुए; अन्यथा Comparator() को constructor of std::priority_queue पर डिफ़ॉल्ट तर्क के रूप में उपयोग किया जाएगा, लेकिन Comparator में कोई डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है। जैसे

SomeObject so; 
std::priority_queue<std::string, std::set<std::string>, Comparator> queue(Comparator(so)); 

Btw: std::setstd::priority_queue की अंतर्निहित कंटेनर की आवश्यकता को पूरा नहीं करता है। आप इसके बजाय std::vector या std::deque का उपयोग कर सकते हैं।

तत्वों को स्टोर करने के लिए उपयोग करने के लिए अंतर्निहित कंटेनर का प्रकार। कंटेनर को SequenceContainer की आवश्यकताओं को पूरा करना होगा, और इसके इटरेटर को RandomAccessIterator की आवश्यकताओं को पूरा करना होगा। इसके अतिरिक्त, यह हमेशा की तरह अर्थ विज्ञान के साथ निम्नलिखित कार्य प्रदान करनी चाहिए:

  • सामने()
  • push_back()
  • pop_back()

मानक कंटेनर std::vector और std::deque इन संतुष्ट आवश्यकताएं।

+0

ए 'प्राथमिकता_क्यू' में' सेट 'की तुलना में कम कार्यक्षमता है। 'प्राथमिकता_क्यू'' को प्राथमिकता देने का एकमात्र (लेकिन संभवतः बहुत अच्छा) कारण दक्षता है। –

संबंधित मुद्दे