为什么STL Set会覆盖具有相同值的对

时间:2017-01-09 10:20:23

标签: c++ c++11 stl

我可以使用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(可能)覆盖具有相同值的对?无论如何,这种配对的关键是不同的。

2 个答案:

答案 0 :(得分:3)

请参阅Compare的{​​{1}}函数的definition

  

标准库的所有地方都使用Compare概念,唯一性由等价关系决定。在不精确的术语中,如果两个对象的比较小于另一个,则认为两个对象a和b是等价的:!comp(a,b)&amp;&amp; !comp(b,a)。

这意味着相同的数字会被视为std::set而不会被复制到您的equivalent

使用

orderedSet

如果你想保留它们

答案 1 :(得分:2)

来自cppreference.com

  

std :: set是一个关联容器,包含一组有序的   密钥类型的唯一对象。

根据您的比较器,只有单个 std :: pair 具有固定的第二个元素才能存储在该集合中。