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

Why does STL Set overwrite pairs with same value

本文关键字:STL Set 覆盖 为什么      更新时间:2023-10-16

我可以使用这个答案按值降序对无序映射进行排序。

但是,对同一作业使用集会失败:

#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

谁能告诉我为什么设置(可能)覆盖具有相同值的对?无论如何,这些对的键是不同的。

参见std::set Compare函数的定义。

在标准库使用 Compare 概念的任何地方,唯一性都是通过使用等价关系来确定的。用不精确的术语来说,如果两个对象 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;
};

如果你想保留它们

从 cppreference.com:

std::set 是一个关联容器,其中包含一组排序的 键类型的唯一对象。

根据比较,该集合中只能存储一个带有固定第二个元件的 std::p air