文章目录
sort()函数的介绍
sort()函数是包含在C++标准库头文件算法类别标头<algorithm>
中的,使用时需要导入该库文件#include<algorithm>
。sort()函数用来实现将指定范围中的元素按非降序顺序排列,或根据二元谓词指定的排序条件排列。sort()函数的实现使用的是快速排序,是排序算法中算是最优的方式了,使用sort()函数实现排序能够提高程序效率。
sort()函数源码分析
C++STL默认提供下面两种sort()函数的接口,接下来我们通过分析源码进一步理解sort()函数的使用。
第①种使用时只需要传入排序对象的迭代器起点和终点(排序范围)。
template <class _RanIt>
_CONSTEXPR20 void sort(const _RanIt _First, const _RanIt _Last) { // order [_First, _Last)
_STD sort(_First, _Last, less<>{});
}
第②种需要传入迭代器的起点、终点(排序范围)还有谓词参数。
template <class _RanIt, class _Pr>
_CONSTEXPR20 void sort(const _RanIt _First, const _RanIt _Last, _Pr _Pred) { // order [_First, _Last)
_Adl_verify_range(_First, _Last);
const auto _UFirst = _Get_unwrapped(_First);
const auto _ULast = _Get_unwrapped(_Last);
_Sort_unchecked(_UFirst, _ULast, _ULast - _UFirst, _Pass_fn(_Pred));
}
上面是两种不同重载版本的sort()函数声明,他们接受的参数有:
_Firs
指向要排序范围的起始元素的迭代器。
_Last
指向要排序范围结束后的第一个元素的迭代器(即范围不包括此迭代器指向的元素)。
_Pred
一个谓词,用于确定排序顺序。用户定义的谓词函数对象,定义排序中连续元素要满足的比较条件。
sort()函数不同重载版本的区别
当我们使用sort()函数时,上面介绍过了第三个参数的用途是通过使用者自定义的谓词函数对象,来确定排序方式。
在使用的时候如果没传入第三个参数时则编译器调用的是第①种方式的sort()函数,这种方式的sort()函数是默认为less<>{}
(升序)的排序方式。当我们想要实现其他排序方式(升序或者其他)的话就需要传入第三个参数来实现对应的排序效果。
sort()函数的应用实例
第①种重载版本的应用实例
实现对vector对象的排序:
程序运行后的结果:
多维对象排序的应用实例
对于二维数组的排序
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<vector<int>> nums = { {5,8},{2,10},{2,6},{2,8},{1,100},{6,6},{6,1} };
sort(nums.begin(), nums.end());
int n = nums.size();
for (auto num : nums)
{
cout << num[0]<<" "<<num[1] << endl;
}
return 0;
}
输出结果如下所示:
我们只传入了迭代器的起点和终,也就是之传入了排序的范围,所以调用的是第①种重载版本的sort()函数,通过输出结果可以发现无论对于一维的对象还是二维的对象他的排序结果都是升序,通过观察二维数组的输出结果可以发现,sort()函数的不仅对第一个下标下num[0]
的数据进行了排序,还根据num[1]
完成了排序,并且都是按照升序排序的。
第②种重载版本的应用实例
当我们想要实现的就不是单纯的升序排序,要实现根据自己的需求完成对数组的排序,就需要我们传入第三个参数谓词来实现修改sort()函数的排序规则,使排序规则为我们预期的效果,这个时候调用的就是上面第②种重载版本的sort()函数。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<int>nums = { 1,23,6,98,88,66,5,6};
sort(nums.begin(), nums.end(), [](const auto& e1, const auto& e2) {return e1 > e2;}); // 这里使用了C++11种新增的特性 Lambda表达式,实现了将nums对象进行降序排序。
int n = nums.size();
for (int i = 0;i < n;i++)
{
cout << nums[i] << " ";
}
return 0;
}
多维对象自定义排序的应用实例
那么我们想要实现对该二维数组对象排序,排序后的结果是按照第一个数据进行升序,第二个数组进行降序该如何进行呢?
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<vector<int>> nums = { {5,8},{2,10},{2,6},{2,8},{1,100},{6,6},{6,1} };
sort(nums.begin(), nums.end(), [](const auto& e1, const auto& e2) {return e1[0] > e2[0] || (e1[0] == e2[0] && e1[1] < e2[1]);});
int n = nums.size();
for (auto num : nums)
{
cout << num[0]<<" "<<num[1] << endl;
}
return 0;
}
这里的第三个参数(谓词)使用的是C++11新增的特性Lambda表达式
,当然也可以使用自定义函数来实现这一效果。
[](const auto& e1, const auto& e2) {return e1[0] > e2[0] || (e1[0] == e2[0] && e1[1] < e2[1]);}
修改了二维数组的排序方式,得到的结果如图所示:
上面就是本文要介绍的主要内容,有相关问题可以评论提出喔!感谢阅读!