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关键词,与上面用法一样

相关推荐
I_belong_to_jesus4 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Rabitebla6 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
码客-ygluu11 小时前
一个通用游戏数据服务器
c++·架构
another heaven11 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
YLCHUP14 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
xiaoye-duck14 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
思麟呀14 小时前
背包DP(01背包+完全背包)
c++·算法
旖旎夜光16 小时前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习
ShineWinsu16 小时前
对于Qt:QTabWidget常见属性的解析
开发语言·数据库·c++·qt·浏览器·qtabwidget·标签页
俊俊几年的18 小时前
动态规划(Dynamic Programming)详解:从入门到 LeetCode Hot 100
linux·c++·算法·leetcode·嵌入式·动态规划·c