2016-05-15 6 views
1

だから私はタイプの構造体で優先キューを作ることができないことを知っていますが、その理由を正確には理解していませんか?あなたが独自の型を作るためのテンプレートクラスを作ることができれば、どうしてstructが違うのでしょうか?structオブジェクトの優先度キューを作成できないのはなぜですか?

これは私のコードはmain.cppにで次のようになります。

#include <iostream> 
#include <queue> 
#include <string> 

struct DATA { 
    std::string key; 
    int data; 
}; 

int main() { 
    std::priority_queue<DATA> priorityQ; 
    DATA newItem; 
    newItem.key = "apples"; 
    newItem.data = 3; 
    priorityQ.push(newItem); 
    std::cout << priorityQ.top().key << std::endl; 

    std::cout << "Press the 'ENTER' key to continue..."; 
    std::cin.get(); 

    return 0; 
} 

エラーが思い付く:

Error C2678 binary '<': no operator found which takes a left-hand 
operand of type 'const DATA' (or there is no acceptable conversion) 
TestProj c:\program files (x86)\microsoft visual studio 
14.0\vc\include\xstddef Line: 240  

私はこの演算子のオーバーロードを作ってみました:

bool operator<(const DATA& a, const DATA& b) { 
    return a.data > b.data; 
} 

しかし、それはまだコンパイルされません...

私の質問です:優先度のキューに構造体オブジェクトを配置することは可能ですか?そうでない場合、なぜですか?

+2

'演算子<'過負荷があなたが必要とするすべてである必要があります。どこに置いたのですか?あなたは 'priority_queue'を作る前に定義しましたか、それとも少なくとも宣言しましたか? –

+0

http://ideone.com/FISfMN –

+0

ああ!私はそんなにばかげている、これは私がそれを理解しようと長い間(私は作業しているより大きなプロジェクトからこれを単純化したので)私を取ったが、ヘッダーファイルに演算子のオーバーロード関数を宣言し、構造体の前に宣言されています....構造体と主体の間で移動し、作業しています...ありがとう –

答えて

0

ここに移動します。ライブ

#include <iostream> 
#include <queue> 
#include <string> 

struct DATA { 
    std::string key; 
    int data; 
    // EITHER THIS 
    bool operator<(const DATA & d2) const {return <your logic here>;} 

}; 
// OR THIS 
bool operator<(const DATA &d1, const DATA & d2){return <your logic here>;} 


int main() { 
    std::priority_queue<DATA> priorityQ; 
    DATA newItem; 
    newItem.key = "apples"; 
    newItem.data = 3; 
    priorityQ.push(newItem); 
    std::cout << priorityQ.top().key << std::endl; 

    std::cout << "Press the 'ENTER' key to continue..."; 
    std::cin.get(); 

    return 0; 
} 

https://godbolt.org/g/uC6JdB

-2

priority_queueデータ構造体は、 '<'演算子に 'const'戻り値で応答する必要があります。 returnブール値を "const"として宣言する必要があります。

bool operator<(const DATA& a, const DATA& b) const{ 
    return a.data > b.data; 
} 
+0

'const'として' boolean'値を返しますか?どういう意味ですか ? – P0W

+0

その構文はメンバ関数用です。そして、それは戻り値をconstにしません、それは 'this'ポインタがconstへのポインタであることを意味します。しかし、これはメンバ関数ではありません。そうであれば、1つの議論しか取らないだろう。 –

関連する問題