2017-06-28 17 views
0

ファンクタを使用して構造体HeapNodestd::priority_queueを追加します。std :: priority_queueにファンクタを含む構造体が含まれています

#include <iostream> 
#include <queue> 
#include <algorithm> 

using namespace std; 

struct HeapNode 
{ 
    bool operator()(const struct HeapNode &a,const struct HeapNode &b) const 
    { 
     return b.c>=a.c; 
    } 
    double c;  
    double v;  
}h; 

int main() 
{ 
    priority_queue<struct HeapNode,vector<struct HeapNode>,h> H; 
    struct HeapNode a={1,2}; 
    struct HeapNode b={3,2}; 
    struct HeapNode c={6,2}; 
    H.push(a); 
    H.push(b); 
    H.push(c); 
} 

しかし、エラーがあります。

queue.cpp: In function ‘int main()’: 
queue.cpp:19:65: error: type/value mismatch at argument 3 in template parameter list for ‘template<class _Tp, class _Sequence, class _Compare> class std::priority_queue’ 
    priority_queue<struct HeapNode,vector<struct HeapNode>,heapnode> H; 
                   ^
queue.cpp:19:65: note: expected a type, got ‘heapnode’ 
queue.cpp:23:4: error: request for member ‘push’ in ‘H’, which is of non-class type ‘int’ 
    H.push(1); 
    ^
queue.cpp:24:4: error: request for member ‘push’ in ‘H’, which is of non-class type ‘int’ 
    H.push(2); 
    ^
queue.cpp:25:4: error: request for member ‘push’ in ‘H’, which is of non-class type ‘int’ 
    H.push(3); 
    ^

私は参照を研究してきたが、私はまだstd::priority_queueについて困惑しています。

答えて

0

hは、静的記憶期間を持つオブジェクトを指定します。 priority_queueテンプレートは、タイプを想定しています。エラーは、この上で非常に明確である:

error: type/value mismatch at argument 3 in template parameter list 

さて、それは少し奇妙な(と非効率的)だ(1)あなたはそれを比較するためにファンクタとして型自体を使用しています。私はそれを分割お勧めします。

struct HeapNode 
{ 
    double c;  
    double v;  
}; 

struct HeapNodeCompare 
{ 
    bool operator()(const struct HeapNode &a,const struct HeapNode &b) const 
    { 
     return b.c>=a.c; 
    } 
}; 

は今、あなたのキューは、次のような簡単に定義することができます

priority_queue<HeapNode, vector<HeapNode>, HeapNodeCompare> H; 

(1)ファンクターがデフォルトであるために構築する必要があるので、私は非効率的と言います中古。あなたのタイプは、記憶域を占める意味のある状態です。ファンクタとして型自体を使用すると、それは少し無駄です。セパレートタイプは状態を持たず、最小のストレージを占有します。

+1

は、それぞれ比較のためのものか、一度だけですか?たぶん2倍の2倍の廃棄物は一度あれば維持可能でしょうか? – Default

+0

@Default - なぜ使用されていないものを支払うのですか?ファンクタを使うときには何かを支払う必要がありますが、ファンクションの比較にはまったく関係しない2つのダブルは無駄です。また、データとファンクタと同じクラスを使用すると、単一責任の原則に違反しますが、それは悪化します。 – StoryTeller

0

priority_queueテンプレートのインスタンス化の3番目の引数は、型ではなくグローバル変数です。 struct HeapNodeを宣言し、グローバル変数hstruct HeapNodeと宣言しました。テンプレートのインスタンス化でhstruct HeapNodeに置き換えます。

また、ノードクラスを再利用するのではなく、別のコンパレータクラスを持つ方がよいと思います。これは、priority_queueがコンパレータを持つstruct HeapNodeのインスタンスを作成するためです。

関連する問題