如何对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
相关产品推荐
相关产品推荐

