为什么 STL Set 会覆盖具有相同值的对
Why does STL Set overwrite pairs with same value
我可以使用这个答案按值降序对无序映射进行排序。
但是,对同一作业使用集会失败:
#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。
相关文章:
- 通过函数指针对类内的 STL SET 使用自定义比较器
- C++STL中set的'insert'函数的原理是什么?
- 直接访问 STL "set"元素
- 为什么 STL Set 会覆盖具有相同值的对
- STD :: SET(或STD :: MAP)是否有一个提供基于值的查找的STL比较器?STD :: lands_les
- 如何在STL MAP(SET)中的范围中找到所有元素
- STL SET 迭代器赋值 没有可行的候选者
- Binary_search 在 STL 集中查找 set 的成员函数?
- STL中set的insert函数中为什么存在位置参数
- STL <set> 搜索
- 为什么 STL <set> 重载运算符<函数必须是常量函数?
- 在C#中创建一个STL std::set并封送到C++
- C++:STL:set:存储值常量
- 如何迭代地打印SET (STL)中的元素
- C++ STL set implementation
- 为什么C++ STL set 容器的 count() 方法被命名为这样?
- 使用迭代器调用STL Set中的非静态函数
- STL SET中项的顺序因程序的不同运行而不同
- STL set/map中的随机元素log n
- C++ Stl Set Behavior