2017-04-02 37 views
0

在下面給出的代碼中,我試圖保留priority_queue中的一些值,以相應地對其鍵值存儲在「key」向量中進行排序。然後,我正在更改關鍵值以查看比較器是否正常工作。在這裏,當我將鍵[8]更改爲10時,值8正確更改其在隊列中的位置。但是當我將密鑰[2]更改爲-1時,它改變了它在隊列中的位置,但不正確。它應該位於隊列的頂部,因爲它的關鍵值是最小的,但事實並非如此。C++的priority_queue的修改比較器無法正常工作

是我寫比較器代碼的方式錯了嗎?或者,這是我不正確的事情?

我想知道正確的方式來修改優先級隊列的比較,如果我想按升序排序值相應的鍵值。

enter image description here

#include <bits/stdc++.h> 
using namespace std; 
vector <int> key(1000); 
struct comp{ 
    bool operator()(int a,int b)const{ 
     return key[a]>key[b]; 
    } 
}; 
int main() 
{ 
    priority_queue <int,vector<int>,comp> q,temp; 
    for(int a=0;a<10;a++){ 
     int n=rand()%16; 
     key[a]=n; 
     q.push(a); 
    } 
    while(!q.empty()){ 
     temp=q; 
     while(!temp.empty()){ 
      cout<< temp.top() << "(" << key[temp.top()] << ") "; 
      temp.pop(); 
     } 
     cout<<endl<<endl; 
     int u,v; 
     cin>> u >> v; 
     key[u]=v; 
    } 
    return 0; 
} 
+6

你在哪裏拿起可怕'的#include <位/ STDC + + H>'習慣?這是一個嚴肅的問題。直到一年前,初學者從未這樣做過。 –

+1

提問時,最好不要在圖像中包含代碼。 – HDJEMAI

+0

它會產生任何問題嗎?我實際上使用它來節省編程比賽期間的時間。 @Hackl –

回答

0

你從未改變Q值。您在temp中製作了q的副本,但從未對q做任何事情。

+0

我正在更改循環中q元素的鍵值,然後再將q複製到temp中。它發生在循環中。 –

+2

當您在外面更改密鑰時,隊列不會再次排序。 – kjpus

相關問題