2016-12-28 19 views
2

プライオリティキューを作成しようとしています。プライオリティキューはintのペアで構成されています。私は間違って何をしていますか?プライオリティキューが正しく比較されていないC++

は、これは私のコンパレータクラスです:

class Compare 
{ 
public: 
    bool operator() (pair<int, char>a, pair<int, char>b) 
    { 
     return a.first > b.first; 
    } 
}; 

そして、これは私のプライオリティキューです:

party.push(make_pair(2, 'A')); 
party.push(make_pair(3, 'B')); 
cout<<party.top().first; 

ではなく、2を返します。

priority_queue<pair<int, char>, vector<pair<int, char>>, Compare> party; 

しかし、私は、コードを実行した場合優先度キューの実装を修正するにはどうすればよいですか?

答えて

3

ジョーディ・ラ=フォージが使用するのと同じ修正:極性を反転:

bool operator() (const pair<int, char> &a, const pair<int, char> &b) const 
{ 
    return a.first < b.first; 
} 

比較関数は、常に論理<操作別称、厳しい弱い順序付けを実装します。しかしpriority_queue、によって定義、gives you the largest value in the priority queue, first

は...

、(デフォルトで)最大の要素の一定時間のルックアップを提供しますが、比較関数は、まだ厳しい弱い順序である:

厳密な弱い順序を提供する比較タイプ。

少し直感に反するが、しばらく、それは意味を成しません...

PS:比較関数はconst関数である、と私に示したように、効率のために、constパラメータを取る必要があります例。それは追加の詳細です。

+0

実際、効率についての部分は議論の余地があります。関数がインライン展開されていれば、それは全く問題ではありません。想像もできないようなケースでは、値渡しでは少なくとも86_64ではパフォーマンスが向上します。 – SergeyA

1

優先キューでは、コンパレータがlessを実装するには、弱い順序付けを必要とする他のコンテナと同じものが必要です。しかし、より大きな要素を上に置くことによって機能します。 greaterを効果的に実装したので、キューを元に戻したところで、最小の要素が上に移動します。

問題を解決するには、コンパレータを変更して2つの要素のうち小さい方を返すようにします。

関連する問題