You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对vector pair先按第二个元素降序、再按第一个元素降序排序?

如何按指定规则对std::vector<std::pair<int, int>>排序?

嘿,这个排序需求我刚好处理过,给你两种简单好用的实现方式,保证能得到你想要的结果~

首先明确核心规则:优先按pair的第二个元素降序排列,当第二个元素相同时,按第一个元素降序排列。实现的关键是给C++标准库的sort函数传入一个自定义比较器,告诉它怎么判断两个元素的先后顺序。

方法一:自定义比较函数

写一个单独的布尔型函数,清晰定义两个pair的比较逻辑:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 自定义比较器函数
bool comparePairs(const pair<int, int>& a, const pair<int, int>& b) {
    // 第一步:优先比较第二个元素,降序排列
    if (a.second != b.second) {
        return a.second > b.second;
    }
    // 第二步:第二个元素相等时,比较第一个元素,降序排列
    return a.first > b.first;
}

int main() {
    // 初始化你的pair集合
    vector<pair<int, int>> pairs = {{1,0}, {2,0}, {1,1}, {2,1}, {3,1}};
    
    // 传入自定义比较器执行排序
    sort(pairs.begin(), pairs.end(), comparePairs);
    
    // 输出验证结果
    for (const auto& p : pairs) {
        cout << "(" << p.first << "," << p.second << ") ";
    }
    // 输出:(3,1) (2,1) (1,1) (2,0) (1,0)
    return 0;
}

方法二:使用Lambda表达式(更简洁)

如果不想单独写函数,用Lambda表达式直接嵌入sort调用里,代码会更紧凑:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    vector<pair<int, int>> pairs = {{1,0}, {2,0}, {1,1}, {2,1}, {3,1}};
    
    // 直接在sort中定义Lambda比较器
    sort(pairs.begin(), pairs.end(), [](const pair<int, int>& a, const pair<int, int>& b) {
        if (a.second != b.second) {
            return a.second > b.second;
        }
        return a.first > b.first;
    });
    
    // 输出验证
    for (const auto& p : pairs) {
        cout << "(" << p.first << "," << p.second << ") ";
    }
    return 0;
}

逻辑说明

两种方法的核心逻辑完全一致:

  • 当两个pair的第二个元素不同时,让第二个元素大的排在前面(降序);
  • 当第二个元素相同时,让第一个元素大的排在前面(降序)。

这个比较逻辑符合C++标准库sort要求的严格弱序,不会出现排序逻辑矛盾的问题,放心用就行~

内容的提问来源于stack exchange,提问作者Pritam Saha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:31:03