2009-10-09 10 views
13

पर एसटीएल प्राथमिकता कतार मुझे अपनी प्राथमिकता कतार प्राप्त करने में बहुत परेशानी हो रही है यह पहचानने के लिए कि कौन सा पैरामीटर इसे सॉर्ट करना चाहिए। मैंने अपनी कस्टम कक्षा में ऑपरेटर से कम अधिभारित किया है लेकिन ऐसा लगता है कि इसका उपयोग नहीं किया जाता है। यहाँ प्रासंगिक कोड है:कस्टम कक्षा

Node.h

class Node 
{ 
public: 
    Node(...); 
    ~Node(); 
    bool operator<(Node &aNode); 
... 
} 

Node.cpp

#include "Node.h" 
bool Node::operator<(Node &aNode) 
{ 
    return (this->getTotalCost() < aNode.getTotalCost()); 
} 

getTotalCost() किसी पूर्णांक

main.cpp

priority_queue<Node*, vector<Node*>,less<vector<Node*>::value_type> > nodesToCheck; 

रिटर्न क्या क्या मैं लापता हूं और/या गलत कर रहा हूँ?

+0

आप चाय के ऐ में होना चाहिए वर्ग :) http://stackoverflow.com/questions/1517854/priorityqueue-comparison-for-pointers – Polaris878

+0

अच्छा जासूसी कौशल;) – bmalicoat

उत्तर

21

less<vector<Node*>::value_type> मतलब है कि आपके तुलनित्र एक दूसरे से तुलना संकेत, अपने वेक्टर अर्थ स्मृति में लेआउट से हल हो जाएगा नोड्स का।

आप इस तरह कुछ करना चाहता हूँ:

#include <functional> 
struct DereferenceCompareNode : public std::binary_function<Node*, Node*, bool> 
{ 
    bool operator()(const Node* lhs, const Node* rhs) const 
    { 
     return lhs->getTotalCost() < rhs->getTotalCost(); 
    } 
}; 

// later... 
priority_queue<Node*, vector<Node*>, DereferenceCompareNode> nodesToCheck; 

ध्यान दें कि आप totalCost की अपनी परिभाषा में स्थिरांक-सही होने की जरूरत है।

संपादित करें: अब जब कि सी ++ 11 यहाँ है, तो आप अब और std :: binary_function से प्राप्त करना (आप कार्यात्मक # शामिल की जरूरत नहीं है जिसका मतलब है) की जरूरत नहीं है

+1

जिज्ञासा से बाहर: केवल एक समारोह के बजाय ऑपरेटर() के साथ एक संरचना को परिभाषित क्यों करें? –

+3

आपको करना है। आप कार्यों के साथ टेम्पलेट्स विशेषज्ञ नहीं कर सकते हैं, बस प्रकार (विशिष्ट परिस्थितियों को छोड़कर)। फ़ंक्शन ऑब्जेक्ट्स एसटीएल प्रोग्रामिंग का एक बहुत ही महत्वपूर्ण हिस्सा हैं। स्कॉट मेयर के * प्रभावी एसटीएल * पर पढ़ने के लिए एक महान पुस्तक है।यह एसटीएल और इसका लाभ लेने के सर्वोत्तम तरीकों के बारे में बताता है। – rlbond

+0

इसके अलावा, मुझे यह इंगित करना चाहिए कि 'std :: कम 'एक फ़ंक्शन ऑब्जेक्ट भी है (यानी,' ऑपरेटर()' के साथ एक संरचना – rlbond

14

आपको अपना पैरामीटर const बनाने की आवश्यकता है, क्योंकि अब तक आप इसे एक गैर-लागत संदर्भ दे रहे हैं, जिसका अर्थ है कि आप जिस ऑब्जेक्ट की तुलना कर रहे हैं उसे संशोधित कर सकते हैं। (जो आप नहीं हैं, और शायद नहीं होना चाहिए)।

आप कॉन्स्ट-सही नहीं हैं। आपका operator< नोड में संशोधन करने की नहीं है, इसलिए समारोह स्थिरांक होना चाहिए:

bool operator<(const Node &aNode) const; 

उसके बाद, यदि आपको कोई समस्या getTotalCost() फ़ंक्शन को कॉल है, यह संभव है कि यह रूप में अच्छी तरह const नहीं है। इसे कॉन्स के रूप में चिह्नित करें यदि यह पहले से नहीं है:

int getTotalCost(void) const; 

आपका कोड अब (अधिक) कॉन्स्ट-सही है।

एक तरफ ध्यान दें पर, द्विआधारी ऑपरेटरों आमतौर पर कक्षा के बाहर लागू किया जाता है:

class Node 
{ 
public: 
    // ... 

    int getTotalCost(void) const; 

    // ... 
}; 

bool operator<(const Node& lhs, const Node& rhs) 
{ 
    return lhs.getTotalCost() < rhs.getTotalCost(); 
} 
+1

+1: कम से कम इंटरफेस अच्छी बातें कर रहे हैं –

+0

वास्तव में, मैं की परिभाषा से सहमत नहीं है कुछ मामलों में कक्षा के बाहर 'ऑपरेटर <'। यदि यह स्पष्ट है कि यह क्या करना है, तो मुझे नहीं लगता कि यह वास्तव में एक सदस्य के रूप में परिभाषित करने का एक बड़ा सौदा है। इसके अलावा यह बूस्ट.ऑपरेटर्स के उपयोग की अनुमति देता है। – rlbond

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