std::sort排序依据如何确定?pair数组为何按首元素排序?
为什么std::sort对pair数组排序时优先依据第一个元素?
这个问题的关键在于std::pair<T1, T2>的默认比较规则,以及std::sort默认依赖这个规则来排序的工作机制。
先看std::pair的默认比较逻辑
C++标准库已经为std::pair预先定义了operator<运算符,它的判断逻辑非常明确:
- 首先比较两个pair的
first成员:如果a.first < b.first,直接返回true;如果b.first < a.first,直接返回false; - 只有当两个pair的
first成员完全相等时,才会进一步比较second成员的大小,用a.second < b.second的结果作为最终判断。
在你的代码例子里,所有pair的first元素都是唯一的(5、40、-3、4),所以排序过程中完全不会涉及到second成员的比较,直接按first的升序排列就得到了-3 4 5 40的结果。如果有两个pair的first相同,比如你把p[0]改成pair<int, int>(5, 10),这时候才会通过second的值来区分它们的顺序。
再讲std::sort的工作机制
std::sort是一个通用的不稳定排序算法,默认情况下它会使用元素类型的operator<来确定元素的相对顺序。
它会遍历你传入的区间(这里是p到p+4),通过反复比较元素的“小于”关系,将元素重新排列成符合operator<定义的升序序列。对于std::pair来说,就是严格遵循上面说的先比first再比second的规则。
如果你想让排序依据second元素,只需要给std::sort传入一个自定义的比较函数或者lambda表达式即可,比如:
sort(p, p + 4, [](const pair<int, int>& a, const pair<int, int>& b) { // 按second元素升序排列 return a.second < b.second; });
这样排序后的结果就会优先按照second的值来排列了。
内容的提问来源于stack exchange,提问作者user9414424
相关产品推荐
相关产品推荐

