2012-11-07 26 views
5

मुझे पता है कि समान धागे हैं लेकिन मेरे कार्यक्रम को काम करने के लिए मजबूर करने में एक घंटे खर्च करने के बाद, मैंने एक मदद मांगी। सबसे पहले। मैंने सोचा है कि मुझे सी ++ बहुत अच्छा पता है क्योंकि मैंने कुछ ऐसा करने की कोशिश की जो PHP में बहुत आसान है (प्रोग्रामिंग भाषा जो मुझे सबसे अच्छी तरह से पता है) लेकिन सी ++ में बहुत जटिल है (कम से कम मेरे लिए बहुत जटिल है)। इसलिए मैं स्ट्रक्चर पॉइंटर्स की प्राथमिकता_क्यू बनाना चाहता हूं। यह स्पष्ट है कि मुझे अपनी तुलनात्मक कार्य बनाने की आवश्यकता है। तो मैं इस कोड की कोशिश की:संरचना के पॉइंटर्स की प्राथमिकता कतार

#include <iostream> 
#include <list> 
#include <queue> 

using namespace std; 

typedef struct MI 
{ 
    int nr; 
    int koszt; 
    bool operator<(const MI& a, const MI& b) { 
     return a.koszt > b.koszt; 
} 
} miasto, *miasto_wsk; 

int main() 
{ 
    priority_queue<miasto_wsk> q; 
    miasto_wsk mi; 
    mi = new miasto; 
    mi->nr = 1; 
    mi->koszt = 2; 
    q.push(mi); 
} 

और जब मैं अपने कार्यक्रम संकलन करने की कोशिश की मैं संकलन त्रुटि के साथ समाप्त हो गया:

test.cpp:11:44: error: ‘bool MI::operator<(const MI&, const MI&)’ must take exactly one argument 

तुम मुझे व्याख्या कर सकते हैं मैं गलत क्या कर रही हूं और मुझे स्पष्ट करने दें सभी structs के साथ इस सामान की तुलना में काम करता है (या मुझे एक अच्छा ट्यूटोरियल/लेख जो कि बताते हैं शुरू से ही देना)

संपादित करें:

मैं इस के लिए मेरे कोड बदल दिया है:

#include <iostream> 
#include <list> 
#include <queue> 

using namespace std; 

typedef struct miasto 
{ 
    int nr; 
    int koszt; 
} *miasto_wsk; 

bool myComparator(miasto_wsk arg1, miasto_wsk arg2) { 
     return arg1->koszt < arg2->koszt; //calls your operator 
} 

int main() 
{ 
    priority_queue<miasto_wsk, vector<miasto_wsk>, myComparator> q; 
    miasto_wsk mi; 
    mi = new miasto; 
    mi->nr = 1; 
    mi->koszt = 2; 
    q.push(mi); 
} 

और अब मैं यह त्रुटि संदेश हो रही है:

test.cpp: In function ‘int main()’: 
test.cpp:19:64: error: type/value mismatch at argument 3 in template parameter list for ‘template<class _Tp, class _Sequence, class _Compare> class std::priority_queue’ 
test.cpp:19:64: error: expected a type, got ‘myComparator’ 
test.cpp:19:67: error: invalid type in declaration before ‘;’ token 
test.cpp:24:7: error: request for member ‘push’ in ‘q’, which is of non-class type ‘int’ 

क्या समस्या है? हो सकता है कि मुझे structs के बजाय structs की प्रतियों का उपयोग करना चाहिए?

EDIT2

इस कोड को किसी भी संकलन त्रुटियों का उत्पादन नहीं करता:

#include <iostream> 
#include <list> 
#include <queue> 

using namespace std; 

typedef struct miasto 
{ 
    int nr; 
    int koszt; 
    bool operator< (const miasto& rhs) 
    { 
    koszt > rhs.koszt; 
    } 
} *miasto_wsk; 

int main() 
{ 
    priority_queue<miasto_wsk> q; 
    miasto_wsk mi; 
    mi = new miasto; 
    mi->nr = 1; 
    mi->koszt = 22; 
    q.push(mi); 
} 

तो @Angew विचार गलत हो रहा है।

EDIT3: यह मेरा अंतिम कोड है। यह न केवल त्रुटियों के संकलन के साथ संकलित करता है बल्कि वही कर रहा है जो मैं चाहता हूं। यही कारण है कि MI::operator< समारोह दो के बजाय सिर्फ एक ही तर्क लेना चाहिए: यदि आप इतना @Angew

#include <iostream> 
#include <list> 
#include <queue> 

using namespace std; 

typedef struct miasto 
{ 
    int nr; 
    int koszt; 
} *miasto_wsk; 

struct MyComparator { 
    bool operator() (miasto_wsk arg1, miasto_wsk arg2) { 
     return arg1->koszt > arg2->koszt; //calls your operator 
    } 
}; 


int main() 
{ 
    //priority_queue<miasto_wsk, vector<miasto_wsk>, myComparator> q; 
    priority_queue<miasto_wsk, vector<miasto_wsk>, MyComparator> q; 
    miasto_wsk mi; 
    mi = new miasto; 
    mi->nr = 1; 
    mi->koszt = 22; 
    q.push(mi); 
    miasto_wsk mi1; 
    mi1 = new miasto; 
    mi1->nr = 2; 
    mi1->koszt = 50; 
    q.push(mi1); 
    miasto_wsk mi2; 
    mi2 = new miasto; 
    mi2->nr = 3; 
    mi2->koszt = 1; 
    q.push(mi2); 

    cout << q.top()->koszt << endl; 
    q.pop(); 
    cout << q.top()->koszt << endl; 
    q.pop(); 
    cout << q.top()->koszt << endl; 
    q.pop(); 
} 
+0

आप सही हैं, मैंने प्राथमिकता_क्यू पर दस्तावेज़ों को गलत तरीके से पढ़ा है। मैंने अपना जवाब संपादित कर लिया है। – Angew

उत्तर

6

वहां यहां कई मुद्दे हैं।

जब आप कक्षा के अंदर एक ऑपरेटर को परिभाषित करते हैं, तो यह स्वचालित रूप से कक्षा प्रकार का पैरामीटर अपना पहला तर्क मानता है, और इसके लिए आपको पैरामीटर नहीं बनाना चाहिए। तो आप या तो कक्षा में ऑपरेटर रखने के लिए, तो जैसे:

struct MI { 
    bool operator< (const MI&); 
}; 

या ऑपरेटर के रूप में घोषित मुक्त से चली आ रही: MI को

struct MI { 
    //... 
}; 
bool operator< (const MI&, const MI&); 

दूसरा, अपने priority_queue भंडार संकेत दिए गए, नहीं MI के उदाहरण, इसलिए ऑपरेटर को वैसे भी नहीं बुलाया जाएगा।

struct MyComparator { 
    bool operator() (miasto_wsk arg1, miasto_wsk arg2) { 
    return *arg1 < *arg2; //calls your operator 
    } 
}; 

int main() { 
    priority_queue<miasto_wsk, vector<miasto_wsk>, MyComparator> q; 
    //... 
} 

तीसरा सिर्फ एक शैली बात है: मैं तुम्हें वर्ग के नाम सुझाव देंगे सीधे miasto के बजाय सिर्फ एक typedef बना जब प्राथमिकता कतार, इस तरह (संपादित) परिभाषित करते समय एक तुलनित्र प्रदान करनी चाहिए । यह सी ++ में अधिक प्राकृतिक है।

3

त्रुटि है, अगर आप इसे फिर से पढ़ने, आपको बताता है कि वास्तव में क्या गलत है धन्यवाद।

आप कक्षा में operator<है (जैसे आप करते हैं) तो समारोह केवल एक तर्क लेता है और उस के साथ this तुलना करने के लिए अन्य वस्तु है। यदि आप को नि: शुल्क स्थायी फ़ंक्शन (यानी कक्षा का हिस्सा नहीं) के रूप में बनाते हैं तो उसे दो तर्क लेना पड़ता है।

-1

उपयोग दोस्त कीवर्ड वैश्विक क्षेत्र में ऑपरेटर < डाल करने के लिए

typedef struct MI 
{ 
    int nr; 
    int koszt; 
    friend bool operator<(const MI& a, const MI& b) 
    { 
     return a.koszt > b.koszt; 
    } 
} miasto, *miasto_wsk; 
+1

यहां 'मित्र' की कोई आवश्यकता नहीं है। – juanchopanza

+0

1. समस्या को ठीक करने का यह सबसे आसान तरीका है। 2. यह नोटेशन 'ऑपरेटर <' को एक इंटरफ़ेस में संयोजित करने की अनुमति देता है, यानी पसंदीदा – pogorskiy

+0

है, यह मेरे लिए 'मित्र' के दुरुपयोग की तरह दिखता है। साथ ही, मैं गैर-मित्र गैर-सदस्य फ़ंक्शन को इंटरफ़ेस का हिस्सा मानने पर विचार करूंगा। कुछ दिलचस्प पढ़ना [यहां] (http://www.gotw.ca/publications/mill02.htm)। पीएस मैंने बीटीडब्ल्यू को कम नहीं किया। – juanchopanza

1

आपका तुलना ऑपरेटर, एक सदस्य समारोह है, इसलिए यह केवल theRHS के लिए, एक पैरामीटर लेना चाहिए:

bool operator<(const MI& rhs) { 
     koszt > rhs.koszt; 
} 

एक और विकल्प इसे गैर-सदस्य फ़ंक्शन के रूप में घोषित करना है:

struct MI {}; 

bool operator<(const MI& a, const MI& b) { 
     return a.koszt > b.koszt; 
} 
संबंधित मुद्दे