2010-11-26 2 views
1

にソートされていません。繰り返し新しい要素をプッシュした後C++、プライオリティキューは、アイテムは、私が優先キューに問題が持って

std::priority_queue <NodePrio, std::vector<NodePrio>, sortNodesByPrio> PQ; 

struct NodePrio 
{ 
Node *node; 
double priority; 

NodePrio() : node(NULL), priority(0) {} 
NodePrio(Node *node_, double priority_) : node(node_), priority(priority_) {} 
}; 

class sortNodesByPrio 
{ 
public: 
    bool operator() (const NodePrio &n1, const NodePrio &n2) const; 
} 


bool sortNodesByPrio::operator() (const NodePrio &n1, const NodePrio &n2) const 
{ 
return n1.priority < n2.priority; 
} 

PQ.push(NodePrio(node, distance)); 

、それらがソートされていない、任意の時点から(下記参照)...私はコードをデバッグしようとした、コンパレータのコードが繰り返し行われていた...

Step1: 
push (node, 55.33); 

PQ: 
[0] 55.33 

Step2: 
push (node, 105.91); 

PQ: 
[0] 105.91 
[1] 55.33 

Step 3: 
push (node, 45.18); 

PQ: 
[0] 105.91 
[1] 55.33 
[2] 45.18 

Step 4: 
push (node, 70.44); 

PQ: 
[0] 105.91 
[1] 70.44 
[2] 45.18 
[3] 55.33 //Bad sort 
+0

「ソートされていない」とはどういう意味ですか?あなたが入力しているいくつかのサンプルデータと、すべてのデータをプライオリティキューからポップしたときに結果を投稿できますか? –

+0

あなたは入力の1つまたは2つとその結果のキューの内容を教えてください。また、これまでデバッグの方法で何を試しましたか? – suszterpatt

答えて

0

return n1.priority() < n2.priority(); 
を変更してみてください

「サンプルの結果」に基づき

return n1.priority < n2.priority; 
+1

ダム質問:変数にadding()は何をしますか? –

+0

@ Markus:それは関数呼び出しになります。 'priority'が引数を取らない関数として呼び出せる型のものであれば有効ですが、' double'型なので '()'を追加するとコードが不正になります。私の推測では、OPは自分の正確なコードをコピーアンドペーストしなかったということです。別の構文エラーもあります。 –

+0

@Rohit:申し訳ありませんが、コードを投稿するのは間違いでした....元のソースコードは正しいです。 – Ian

7

にあなたが表示され、それはあなたがプライオリティキューが何であるかを理解していないように見えます。

優先キューでは、要素を(top()およびpop()を使用して)削除すると、要素が優先順位で削除されることが保証されます。要素は優先順位順に格納されず、ヒープに格納されます。

優先度キューが要素をどのように格納するかについては、お気に入りのアルゴリズムブックまたはWebサイトを参照してください。

+0

あなたの説明をお寄せいただきありがとうございます。私はすべての要素が地図のようにソートされていると考えましたが、キーの重複は許されています。 – Ian

+0

それには 'std :: multimap'が必要です。 @suszterpatt。 – suszterpatt

+0

私はまったく思いません。私はPQの仕組みを知っていましたが、アイテムの内部保管については全く間違っていました。 – Ian

関連する問題