【Cpp 语言基础】泛型算法 stable_sort() 在二元组pair上的应用
0. 背景介绍
最近在刷牛客的题。经常遇到排序问题(如下图),经常有一个附加的规则:相同的数值的,按照录入的顺序排序。
可是C++的sort()的底层是快速排序,并不能保证相同数值的顺序不改变。所以最后我不得不自己写冒泡排序。(冒泡排序不改变相同数值的录入顺序)
1. stable_sort() 的引入
写了那么多的排序,但是其实C++里封装有排序函数,而且功能非常强大。
sort函数有sort(),stable_sort()和partial_sort()。sort()函数是对给定区间的元素进行排序,但是会改变值相同的元素的相对位置。stable_sort()是对给定区间的元素进行稳定排序,如果两个元素相等,那么排序完成后两个元素的相对位置保持不变,partial_sort()是对给定区间的元素进行部分排序。默认的顺序是由小到大进行排序。
三种函数的用法如下
sort(v.begin(),v.begin()+4,comp);
sort(v.begin(),v.end(),comp);
stable_sort(v.begin(),v.end(),comp)
//注:v为容器
stable_sort的用法与sort类似
partial_sort(v.begin(),v.begin()+4,v.end());
partial_sort(v.begin(),v.begin()+4,v.end(),comp);
因此,以后可以用 stable_sort()解决这类问题。
2. vector<pair >类型使用sort()函数
当 pair 结合 sort()
类函数使用的时候, pair 默认对 first 升序,当 first 相同时对 second 升序(从小到大)。 也可以通过修改 cmp 函数达到对 second 进行排序,如下所示:
vector<pair<int,int>> v;
//默认排序规则
sort(v.begin(), v.end());
//自定义cmp函数
sort(v.begin(), v.end(), [](auto p1, auto p2) {
return p1.second > p2.second;
});
3. 扩展:pair 二元组是什么?
pair 是 STL(Standard Template Library)中的一个模板类,用于存储两个不同类型的元素。
使用pair类型时需要包含头文件:#include<utility>
pair 类有两个成员变量分别为 first 和 second,这两个成员变量分别代表了 pair 中的第一个元素和第二个元素。
pair的实现是一个结构体,主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。
技巧:pair<int,int> 可用 typedef 定义
typedef pair<int, int> PII;
初始化:
//默认构造函数
pair<int, int> p1;
//带参数的构造函数
pair<int, int> p2(1, 2);
//make_pair函数,定义在utility头文件中
pair<int, int> p3 = make_pair(1, 2);
访问元素:
cout << p1.first << " " << p1.second << endl;
嵌套
//嵌套,用pair存储3个数据
pair<int, pair<int, int>> p(1, { 1,2 });