2017-01-09 51 views
3

我可以使用this答案按值降序對無序地圖進行排序。爲什麼STL設置覆蓋值對具有相同的值

然而,使用一組同樣的工作失敗:

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以下的輸出:

#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; 
} 

與下面的測試運行

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

誰能請告訴我爲什麼設置(可能)覆蓋具有相同值的對?無論如何,這些對的關鍵是不同的。

+0

因爲它認爲這些2個元素是一樣的 – Danh

+0

爲什麼不使用'std :: sort'? – Danh

+2

比較器僅記錄'unordered_map'的值,但不包含鍵。 – ks1322

回答

2

cppreference.com

的std ::集是一個包含有序集合 Key類型的獨特對象的關聯容器。

根據你比較單個的std ::對與固定第二元件可被存儲在該組。

+0

感謝您的參考,我無法找到這些信息。有關如何使用set來工作的任何想法?我知道這是可能的,但我仍然想看看這種方法是否可以替代。 –

+0

當* second *元素的比較對相等時,您可以通過* first *元素進行排序。 –

+0

謝謝,將比較函數改爲「返回pair1.second> pair2.second ||(pair1.second == pair2.second && pair1.first> pair2.first)」修復了它。不過,我不明白爲什麼這有助於您,請您詳細說明一下。 –

3

查看Comparedefinition功能std::set

無處不在標準庫使用比較概念,唯一性是通過使用等價關係來確定的。用不精確的術語,如果兩個對象a和b都不比另一個小,則認爲它們是等價的:!comp(a,b)& &!comp(b,a)。

這意味着相等數量會考慮equivalent,而不是複製到您的orderedSet

使用

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不幸的是,我之前嘗試過,並且出於與Edgar Rokyan所回答的相同原因而導致運行時錯誤。 –

相關問題