【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 });
 
posted @ 2023-12-09 20:29  FBshark  阅读(24)  评论(0编辑  收藏  举报