2009-06-12 16 views
9

मेरे प्राथमिकता कतार घोषित रूप के साथ एक C++ priority_queue के लिए विधि छँटाई लागू करना सीखें:संकेत

std::priority_queue<*MyClass> queue; 

class MyClass { 
    bool operator<(const MyClass* m) const; 
} 

कतार में आइटम छँटाई नहीं है।

क्या गलत है? मैं एक अलग (तुलना) कक्षा को लागू नहीं करना चाहता हूं।

उत्तर सारांश:, सूचक पतों हल कर रहे हैं

समस्या है। इससे बचने का एकमात्र तरीका एक वर्ग है जो 'पॉइंटर्स की तुलना करता है'।

अब लागू किया:

std::priority_queue<*MyClass, vector<*MyClass>, MyClass::CompStr > queue; 

class MyClass { 
    struct CompStr { 
     bool operator()(MyClass* m1, MyClass* m2); 
    } 
} 
+0

मैं वास्तव में पालन नहीं कर सकता। मैं आपको चिंता के अतिरिक्त अलगाव के साथ जवाब देता हूं और मुझे 2 वोट मिलते हैं। माइक्लास को पॉइंटर से तुलना करने की आवश्यकता क्यों है? ओपन-क्लोज़ सिद्धांत के बारे में क्या, आप यह तय करने के लिए क्या कर रहे हैं जब आपको पॉइंटर्स के बजाय मूल्य प्रकारों की std :: priority_que_que की आवश्यकता होती है। – TimW

उत्तर

11

que तुलना करें functor ptr_less की तुलना करें।

आप ptr_less एसटीडी पुस्तकालय के बाकी के साथ संगत होना करने के लिए (बाइंडरों, संगीतकारों, ...) चाहते हैं:

template<class T> 
struct ptr_less 
    : public binary_function<T, T, bool> { 
     bool operator()(const T& left, const T& right) const{ 
      return ((*left) <(*right)); 
     } 
}; 

std::priority_queue<MyClass*, vector<MyClass*>, ptr_less<MyClass*> > que; 

नहीं तो आप सरलीकृत संस्करण के साथ प्राप्त कर सकते हैं:

struct ptr_less { 
    template<class T> 
    bool operator()(const T& left, const T& right) const { 
     return ((*left) <(*right)); 
    } 
}; 

std::priority_queue<MyClass*, vector<MyClass*>, ptr_less > que; 
क्योंकि मैं इसे इस्तेमाल कभी नहीं किया है, लेकिन एक सीधी तरह करने के लिए
+0

क्या कुछ कृपया मुझे बताएं कि क्या गलत है और क्यों -1, यह कोड काम कर रहा है और वैध सी ++ कोड है। – TimW

+0

यह टेम्पलेट ऑपरेटर और सामान के साथ मुश्किल बना रहा है। अभी भी विशिष्ट MyClass के लिए दो पॉइंटर्स के बीच ऑपरेटर कहीं भी लागू किया जाना चाहिए। –

+0

तो मेरा समाधान सामान्य है? बेशक आपको दो MyClass ऑब्जेक्ट्स की तुलना करने के लिए कुछ तरीका चाहिए। अब आपको दो MyClass पॉइंटर्स की तुलना करने के लिए एक विशेष ऑपरेटर की आवश्यकता है और मुझे दो MyClass ऑब्जेक्ट्स की तुलना करने की आवश्यकता है जो अधिक प्राकृतिक है। – TimW

4

ऑपरेटर <() आप एक MyClass ऑब्जेक्ट के लिए एक सूचक के साथ एक MyClass वस्तु की तुलना करेंगे प्रदान की है। लेकिन आपकी कतार में केवल पॉइंटर्स हैं (मुझे लगता है)। आपको तुलनात्मक फ़ंक्शन की आवश्यकता है जो पैरामीटर के रूप में दो पॉइंटर्स लेता है।

यह सब कुछ अनुमानों पर आधारित है - कृपया कॉपी और पेस्ट का उपयोग करके अपना वास्तविक कोड पोस्ट करें।

4

चूंकि आपके priority_queue में केवल पॉइंटर मान हैं, तो यह पॉइंटर्स के लिए डिफ़ॉल्ट तुलना ऑपरेटर का उपयोग करेगा - इससे उन्हें पता द्वारा क्रमबद्ध किया जाएगा जो स्पष्ट रूप से आप नहीं चाहते हैं। यदि आप क्लास इंस्टेंस को मूल्य के अनुसार स्टोर करने के लिए priority_queue बदलते हैं, तो यह आपके द्वारा परिभाषित ऑपरेटर का उपयोग करेगा। या, आपको तुलनात्मक कार्य प्रदान करना होगा।

3

प्राथमिकता कतार सामग्री के बारे में सुनिश्चित नहीं हैं, तो आप ऐसा कर सकते हैं:

class A 
{ 
    friend struct ComparePtrToA; 
public: 
    A(int v=0):a(v){} 
private: 
    int a; 
}; 

struct ComparePtrToA 
{ 
    bool operator()(A* a1, A* a2) {return a1->a < a2->a;} 
}; 

#include <vector> 
#include <algorithm> 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    vector<A*> someAs; 
    someAs.push_back(new A(1)); 
    someAs.push_back(new A(3)); 
    someAs.push_back(new A(2)); 
    sort(someAs.begin(), someAs.end(), ComparePtrToA()); 
} 

मेमोरी लीक नोट करें, यह केवल एक उदाहरण है ...

आगे नोट: यह प्राथमिकता कतार का कार्यान्वयन नहीं है! वेक्टर बस मेरे पॉइंटर्स के माध्यम से दो ऑब्जेक्ट्स की तुलना करने के लिए बनाए गए मज़ेदार का उपयोग करने का एक उदाहरण है। हालांकि मुझे पता है कि प्राथमिकता कतार क्या है और मोटे तौर पर यह कैसे काम करती है, मैंने कभी भी एसटीएल सुविधाओं का उपयोग नहीं किया है जो उन्हें लागू करते हैं।

अपडेट: मुझे लगता है कि टिमडब्ल्यू कुछ मान्य अंक बनाता है। मुझे नहीं पता कि वह इतनी कम क्यों हो गया था। मुझे लगता है कि मेरा उत्तर इस प्रकार सुधार किया जा सकता:

class A 
{ 
public: 
    A(int v=0):a(v){} 
    bool operator<(const A& rhs) { return a < rhs.a; } 
private: 
    int a; 
}; 

struct ComparePtrToA 
{ 
    bool operator()(A* a1, A* a2) {return *a1 < *a2;} 
}; 

जो क्लीनर (खासकर यदि आप संकेत के बजाय मूल्यों की एक कंटेनर रखने पर विचार - कोई आगे काम करना आवश्यक हो जाता है)।

+1

मुझे यह इंगित करना होगा कि प्राथमिकता कतार, मेमोरी लीक और अन्यथा इसे लागू करने के लिए यह वास्तव में एक खराब विधि है। यदि आप चाहते हैं कि एक क्रमबद्ध सरणी है, तो ठीक है, लेकिन प्राथमिकता कतार में पहली आइटम प्राप्त करने और आइटम डालने जैसी चीजों के लिए बेहतर प्रदर्शन गारंटी के साथ एक बहुत अलग कार्यान्वयन है। –

+0

मुझे लगता है कि वह सिर्फ उदाहरण के रूप में सॉर्ट() का उपयोग कर रहा है, ताकि (ए) वह अकेले के बजाय कामकाजी कोड में अपना तुलनित्र पेश कर सके, लेकिन (बी) उसे प्राथमिकता_क्यू स्वयं का उपयोग करने की ज़रूरत नहीं है, जिसे वह कहता है कि वह परिचित नहीं है के साथ ... –

+0

इस उत्तर ने एक तुलनात्मक वर्ग के लिए लागू करने के लिए सही कार्य दिया। यह मेरी प्राथमिकता कतार के लिए काम करता है। बेशक मैं ध्यान में रखता हूं कि मेरी याददाश्त के साथ चीजें कैसे चल रही हैं। यह मजेदार नहीं है कि मुझे पॉइंटर्स की प्राथमिकता_क्यू की आवश्यकता है। –

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