C++ ordered set以pair为键时的默认排序规则是什么?
C++ std::set中pair类型键的默认排序逻辑
嘿,这个问题问得很准!刚好我对std::set(你说的"ordered set"应该指的是这个——毕竟C++标准库的std::ordered_set是哈希集合,本身是无序的,而有序的排序容器是std::set)的pair键排序逻辑很熟悉,给你拆解清楚:
首先明确:std::set默认使用std::less<T>作为比较器,而C++标准库已经为std::pair<U, V>特化了std::less模板,它的排序规则是:
- 优先比较pair的第一个元素:如果两个pair的第一个元素不相等,直接根据第一个元素的
<比较结果确定顺序; - 当第一个元素相等时,才会比较第二个元素,同样用
<运算符判断顺序。
完全符合你的猜想!拿你举的例子来说,(1,1)和(1,2)的第一个元素都是1,相等,所以会对比第二个元素——1 < 2,所以(1,1)会排在(1,2)的前面。
给你贴一段测试代码验证一下:
#include <iostream> #include <set> #include <utility> int main() { std::set<std::pair<int, int>> ordered_set; ordered_set.insert(std::make_pair(1, 2)); ordered_set.insert(std::make_pair(1, 1)); ordered_set.insert(std::make_pair(2, 0)); ordered_set.insert(std::make_pair(0, 5)); // 遍历输出排序后的结果 for (const auto& elem : ordered_set) { std::cout << "(" << elem.first << ", " << elem.second << ")\n"; } return 0; }
这段代码的输出会是:
(0, 5)
(1, 1)
(1, 2)
(2, 0)
另外提个小细节:如果你真的指的是std::ordered_set(哈希无序集合),那它默认不支持pair作为键,因为标准库没有为pair提供默认的哈希函数,这时候你需要自定义哈希器才行,但结合你问的排序逻辑,应该是指有序的std::set,所以上面的解释完全适用。
内容的提问来源于stack exchange,提问作者Rajdeep
相关产品推荐
相关产品推荐

