2017-07-26 14 views
2
#include <functional> 
#include <queue> 
#include <vector> 
#include <iostream> 

struct Temp 
{ 
    int p; 
    std::string str; 
}; 

struct TempCompare 
{ 
    bool operator()(Temp const & a, Temp const & b) 
    { 
     return a.p > b.p; 
    } 
}; 

int main() { 

    std::priority_queue<Temp, std::vector<Temp>, TempCompare> pq; 
    //Enable and Disable the following line to see the different output 
    //{Temp t; t.p=8;t.str="str1";pq.push(t);} 
    {Temp t; t.p=8;t.str="str2";pq.push(t);} 
    {Temp t; t.p=9; t.str="str1";pq.push(t);} 
    {Temp t; t.p=9; t.str="str2";pq.push(t);} 

    while(!pq.empty()) 
    { 
     std::cout << pq.top().p << " " << pq.top().str << std::endl; 
     pq.pop(); 
    } 
} 

メインプログラムの4行目を有効または無効にして実行します。あなたはpriority_queueからのポップアップ時に問題が発生しました。これはstd :: priority_queueのバグですか?

8 str1 
8 str2 
9 str2 
9 str1 

はずの行動が一貫してもらうのが有効になったときには、その無効が

8 str2 
9 str1 
9 str2 

のときの出力は、あなたが得ますか?

+0

等しい要素に対してソートが「安定」であることを示す文書はありますか?そうでない場合、その動作は可能であるように見えますが、必ずしも期待したものとは限りません。 –

+0

['std :: stable_sort'](http://en.cppreference.com/w/cpp/algorithm/stable_sort)のような安定したソートアルゴリズムがありますが、[heapsortはそれらの1つではありません](https:// 19336881/why-isnt-heapsort-stable)。 –

答えて

8

いいえ動作が一貫している必要はありません。 Temp{9, "str1"}Temp{9,"str2"}は比較関数に従って等しいので、それらは任意の順序で返されます。異なる要素をキューに追加すると、その順序が変更される可能性が非常に高いです。

これらを一貫した順序で戻したい場合は、比較機能を拡張する必要があります。最も簡単な方法は、あなたが「pで降順が、strで昇順」したい場合、あなたはそれを自分で行う必要があるでしょう

 bool operator()(Temp const & a, Temp const & b) 
    { 
     return std::tie(a.p,a.str) > std::tie(b.p,b.str); 
    } 

です。

+0

'std :: tie' –

+1

を" pで降順にするが、strで昇順にする " - >' return std :: tie(bp、a.str) Caleth

関連する問題