2012-11-07 166 views
5

我知道有類似的線程,但花了一個小時試圖強制我的程序工作後,我決定尋求幫助。首先是 。我認爲我很瞭解C++,因爲我嘗試了一些非常簡單的PHP(我最瞭解的編程語言),但是在C++中非常複雜(至少對我來說非常複雜)。所以我想創建struct指針的priority_queue。很明顯,我需要創建自己的比較功能。所以,我想這個代碼:結構指針的優先級隊列

#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 

你能解釋我什麼,我做錯了,並解釋我如何都這東西與結構比較作品(或者給我一個很好的教程/條這也解釋了,從一開始)

編輯:

我改變了我的代碼如下:

#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’ 

問題是什麼?也許我應該使用結構的副本,而不是指向結構的指針?

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想法似乎是錯誤的。

編輯3: 這是我的最終代碼。它不僅編譯沒有錯誤,而且也正是我想要的。謝謝你這麼多@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

你說得對,我誤讀了關於priority_queue的文檔。我編輯了我的答案。 – Angew

回答

6

There這裏有很多問題。

當您在類中定義運算符時,它會自動將類類型的參數作爲其第一個參數,並且不能爲其創建參數。所以,你要麼保持操作的類,像這樣:

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

或申報操作自由站立:

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

其次,你的priority_queue商店指針MI,不是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定義優先級隊列,像這樣(EDITED)時,必須提供一個比較。在C++中它更自然。

3

的錯誤,如果你看了一遍,告訴你什麼是錯的:那MI::operator<功能應該只有一個參數,而不是兩個。

如果您在類operator<(像你這樣),那麼該函數只有一個參數,那就是其他物體比較this。如果創建operator<作爲獨立函數函數(即不是類的一部分),則它必須帶有兩個參數。

-1

使用關鍵字friend把運營商<在全球範圍內

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.這個表示法允許將'operator <'結合到一個單獨的界面中,也就是首選 – pogorskiy

+0

對我來說,它看起來像是對'friend'的濫用。此外,我會認爲非朋友非成員函數是接口的一部分。一些有趣的閱讀[這裏](http://www.gotw.ca/publications/mill02.htm)。 PS我沒有downvote順便說一句。 – 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; 
}