我可以使用this回答按降序按值排序无序地图。
但是,对同一作业使用集合失败:
#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);
}
以下输出:
spark: 15
info: 3
the: 2
word: 1
任何人都可以告诉我为什么set(可能)覆盖具有相同值的对?无论如何,这种配对的关键是不同的。
答案 0 :(得分:3)
请参阅Compare
的{{1}}函数的definition。
标准库的所有地方都使用Compare概念,唯一性由等价关系决定。在不精确的术语中,如果两个对象的比较小于另一个,则认为两个对象a和b是等价的:!comp(a,b)&amp;&amp; !comp(b,a)。
这意味着相同的数字会被视为std::set
而不会被复制到您的equivalent
使用
orderedSet
如果你想保留它们
答案 1 :(得分:2)
std :: set是一个关联容器,包含一组有序的 密钥类型的唯一对象。
根据您的比较器,只有单个 std :: pair 具有固定的第二个元素才能存储在该集合中。