2017-03-05 13 views
0
#include <iostream> 
#include <map> 
#include <string> 
#include <vector> 
#include <stack> 
#include <stdio.h> 
#include <list> 
#include <string.h> 
#include <queue> 
#include <algorithm> 
#define pb push_back 
using namespace std; 
typedef pair<int,int> ii; 


struct node{ 
    int digit; 
}; 


class Compare{ 
public: 
    bool operator()(node* a,node* b){ 
     return (a->digit)>(b->digit); 
    } 
}; 


int main() 
{ 
priority_queue<node*,vector<node*>,Compare> pq; 
vector<node*> vec; 
node* p = new node(); 
node* q = new node(); 
node* r = new node(); 
p->digit=100; 
q->digit=200; 
r->digit=300; 
pq.push(p); 
pq.push(q); 
pq.push(r); 
q->digit=50; 
pq.push(nod); 
while(!pq.empty()){ 
    cout<<(pq.top())->digit<<endl; 
    pq.pop(); 
} 
return 0; 
} 

優先度キューに3つのノード(構造体)を挿入した後、キューにある中間要素の値を変更しましたが、要素の更新後に優先度キューを更新する方法がわかりません。std :: priority_queue内の要素を更新するにはどうすればいいですか?

答えて

0

優先度キューは固定優先度で動作するように意図されています。つまり、挿入の瞬間に要素の優先度を把握し、同じままにする必要があります。そのため、要素がキューにプッシュされたときにすべての比較が実行されます。

キーを変更できるソート済みのコンテナが必要な場合は、std::multimapを試してください。それはあなたが要素を取り除くことを可能にし、それ自体を再調整します。 begin()からend()に移動すると、ご希望の順序でnodeにアクセスします。

残念ながら、キーを変更するために要素を削除して挿入する必要があります。うまくいけば、C++ 17はそれについて何かします。

関連する問題