2017-01-09 2 views
3

数値順で値を並べ替えることができるのはthisです。STL Setが同じ値を持つペアを上書きするのはなぜですか

しかし、同じジョブの設定を使用すると失敗します。

次のテストで実行
#include <set> 
#include <functional>  
#include <iostream> 

using namespace std; 

typedef pair<string, int> Pair; 
typedef function<bool(Pair, Pair)> Comparator; 

Comparator DescendingSortComparator = [](Pair pair1, Pair pair2) { 
    return pair1.second > pair2.second; 
}; 

void SortHashTableByValueDescending(unordered_map<string, int> hashTable) { 
    set<Pair, Comparator> orderedSet(hashTable.begin(), hashTable.end(), DescendingSortComparator); 

    for (auto element : orderedSet) 
     cout << element.first << ": " << element.second << endl; 
} 

void Test_SortMap() 
{ 
    unordered_map<string, int> CountTable; 
    CountTable["word"] = 1; 
    CountTable["spark"] = 15; 
    CountTable["the"] = 2; 
    CountTable["mail"] = 3; 
    CountTable["info"] = 3; 
    CountTable["sandwich"] = 15; 

    SortHashTableByValueDescending(CountTable); 
} 

は、次のような出力をyiels:

spark: 15 
info: 3 
the: 2 
word: 1 

ができ、誰くださいなぜ(おそらく)ペアを同じ値で上書きするのか教えてください。このようなペアのキーは、とにかく区別されます。 cppreference.comから

+0

それらを維持したい場合には、これらの2つの要素が同じだと思うので – Danh

+0

'std :: sort'を使わないのはなぜですか? – Danh

+2

コンパレータは 'unordered_map'の値だけを扱いますが、キーは無視します。 – ks1322

答えて

2

のstd ::セットは、Key型の ユニークオブジェクトのソートセットが含まれて連想コンテナです。あなたコンパレータのみ単一のstd ::ペア固定された第2の要素とによる

セットに格納することができます。

+0

参考になりましたが、私はこの情報を見つけることができませんでした。どのように設定を使用して動作させるための任意のアイデア?私はそれがソートで可能であることを知っていますが、私はまだこのアプローチが代替可能かどうかを見たいと思っています。 –

+0

比較ペアの* 2番目の要素が等しい場合は、* first *要素でさらに並べ替えることができます。 –

+0

ありがとう、比較関数を "return pair1.second> pair2.second ||(pair1.second == pair2.second && pair1.first> pair2.first)"に変更しました。それでも、私はなぜこれが助けになるのか分からない。 –

3

Compareの機能std::setを参照してください。

スタンダードライブラリはどこでもコンペアコンセプトを使用していますが、ユニークさは等価関係を使用して決まります。不正確な言葉では、2つのオブジェクトaとbがどちらも比較しない場合、同等であるとみなされます:!comp(a、b)& &!comp(b、a)

これはあなたのorderedSet

に等しい数字はequivalentとみなされ、コピーされないことを意味します使用

Comparator DescendingSortComparator = [](Pair pair1, Pair pair2) { 
    if (pair1.second == pair2.second) 
     return pair1.first > pair2.first; 
    else return pair1.second > pair2.second; 
}; 

あなたは

+0

あなたの答えは間違っています、 'pair1.second> = pair2.second'は有効な比較器ではありません。 –

+0

数学的には?同等のケースではそうではありません。しかし、それは比較関数をオーバーライドする理由です:カスタム動作を達成するためです。 – pergy

+0

@pergy残念ながら私は前にそれを試しました。エドガー・ロッキンと同じ理由でランタイムエラーが発生しました。 –

関連する問題