C++ vector 自定义排序规则(vector<vector<int>>、vector<pair<int,int>>)

vector< int >

cpp 复制代码
vector<int> vec{1,2,3,4};

//默认从小到大排序  1234
sort(vec.begin(),vec.end());
//从大到小排序 4321
sort(vec.begin(),vec.end(),greater<int>());

二维向量vector<vector< int >>

cpp 复制代码
vector<vector<int>> vec{{0,2},{1,5},{1,9},{4,6},{5,9},{8,10}};

//默认优先对第一元素进行从小到大排序,第一元素相同的,按照第二元素从小到大排序
sort(vec.begin(),vec.end()); //[0,2],[1,5],[1,9],[4,6],[5,9],[8,10]

定义cmp函数

1.外部定义

  • 平时的编译器里面自己写的时候 cmp函数前面加不加static都行,但是leetcode刷题时,代码还有实现都是写在类里面的,cmp函数前面一定要加上static修饰。因此建议所有的返回类型都为static bool 类型。
  • 这里不能使用C++11中的auto关键词进行自动类型推导
  • C++ sort函数自定义cmp函数中参数带&符号
cpp 复制代码
static bool cmp(const vector<int>& v1, const vector<int>& v2){
    //如果第一元素相等,则比较第二元素
    if (v1[0] == v2[0])
        return v1[1] < v2[1];
    return v1[0] > v2[0];
}

vector<vector<int>> vec{{0,2},{1,5},{1,9},{4,6},{5,9},{8,10}};
sort(vec.begin(),vec.end(),cmp);
//[8,10],[5,9],[4,6],[1,5],[1,9],[0,2]

2.匿名函数Lambda

cpp 复制代码
vector<vector<int>> vec{{0,2},{1,5},{1,9},{4,6},{5,9},{8,10}};

sort(vec.begin(),vec.end(),[&](const vector<int> &v1, const vector<int> &v2){
    //如果第一元素相等,则比较第二元素
    if (v1[0] == v2[0])
        return v1[1] < v2[1];
    return v1[0] > v2[0];
});
//[8,10],[5,9],[4,6],[1,5],[1,9],[0,2]

可以使用auto

cpp 复制代码
sort(vec.begin(),vec.end(),[&](const auto &v1, const auto &v2){
    //如果第一元素相等,则比较第二元素
    if (v1[0] == v2[0])
        return v1[1] < v2[1];
    return v1[0] > v2[0];
});

vector<pair<int, int>>

初始化

cpp 复制代码
vector<pair<int,int>> vec;

1. vec.emplace_back(1,2);
2. 能够直接用map转化
//unordered_map<int,int> map;
vector<pair<int,int>> vec(map.begin(),map.end());

cmp排序

cpp 复制代码
vector<pair<int,int>> vec;
vec.emplace_back(0,2);
vec.emplace_back(1,5);
vec.emplace_back(1,9);
vec.emplace_back(4,6);
vec.emplace_back(5,9);
vec.emplace_back(8,10);

//默认按第一元素进行从小到大排序
sort(vec.begin(),vec.end());
//[0,2],[1,5],[1,9],[4,6],[5,9],[8,10]

1.外部定义

cpp 复制代码
static bool cmp(const pair<int, int> &a, const pair<int, int> &b) {
    if(b.first == a.first)
        return a.second < b.second;
    return a.first > b.first;
}

sort(vec.begin(),vec.end(),cmp);
//[8,10],[5,9],[4,6],[1,5],[1,9],[0,2]

2.匿名函数Lambda

cpp 复制代码
sort(vec.begin(),vec.end(),[&](const pair<int, int> &a, const pair<int, int> &b) {
    if(b.first == a.first)
        return a.second < b.second;
    return a.first > b.first;
});
//[8,10],[5,9],[4,6],[1,5],[1,9],[0,2]

这里也可以使用auto关键词,与上面用法一样

相关推荐
可乐ea1 小时前
GitHub Security Lab 开源 Fuzzing Taskflow:让 LLM 智能体自己跑完 C/C++ 模糊测试
jvm·c++·github·模糊测试·mcp·代码agent·智能体自动化
朝朝辞暮i2 小时前
C++ 第 13 课:值传递 —— 为什么函数里改了,外面却没变?
java·c++·算法
无忧.芙桃3 小时前
C++语言原理与实践(十):vector类的底层实现
开发语言·c++·算法
无名猿3 小时前
std::variant 完全指南:类型安全的 union 与 std::visit 用法
c++·stl·标准库·现代c++
无名猿4 小时前
C++ 迭代器五分类与失效场景汇总:一张表避开所有 UB
c++·stl·标准库·踩坑记录
0+1114 小时前
算法 --模拟
c++·算法·leetcode
hetao17338374 小时前
2026-10-01~02 hetao1733837 的刷题记录
c++·算法
郝学胜-神的一滴5 小时前
AI 编程智能体 03:拆解当下主流智能体能力
开发语言·c++·人工智能·python·程序人生·游戏
宵时待雨6 小时前
linux笔记归纳25:多路转接epoll
linux·服务器·网络·c++
Frank_refuel6 小时前
【C++项目】手撕JRpc框架(单机怎么优化到分布式思想)
开发语言·c++