C++中sort排序函数的原理用法

sort函数

sort函数可以用来给指定区间内的数据按照某种规则排序,在这里贴一下sort函数的代码

template inline
	void sort(_RanIt _First, _RanIt _Last, _Pr _Pred)
	{	// order [_First, _Last), using _Pred
	_DEBUG_RANGE(_First, _Last);
	_Sort_unchecked(_Unchecked(_First), _Unchecked(_Last), _Pred);
	}

能够看出该函数是经过多层调用的,再深层次就不贴了大家可以打开代码库看。
使用时默认情况下是两个参数,例如

vector tmp = {2,1,3,5,7,6,4};
sort(tmp.begin(), tmp.end());

此情况下tmp内元素是按照升序排列的,打印会输出“1,2,3,4,5,6,7”。通过函数代码能看出sort函数是有三个参数的,依次是此区间的起始位此区间的结束位的下一个排序方式。如果想按照降序排列,就需要加入第三个参数。

第三个参数的几种实现方式

函数

第三个参数可以是一个函数,返回bool型变量。

bool cmp2(const int n1, const int n2) {
	return n1 > n2;
}

sort函数使用方法为:

vector tmp = { 2,1,3,5,7,6,4 };
	sort(tmp.begin(), tmp.end(), cmp2);

此情况下tmp内元素是按照降序排列的,打印会输出“7,6,5,4,3,2,1”。

仿函数(函数对象)

第三个参数可以是一个仿函数,由结构体实现,默认的有less()greater(),也可以自己实现。

template
	struct less
	{	// functor for operator<
	typedef _Ty first_argument_type;
	typedef _Ty second_argument_type;
	typedef bool result_type;

	constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const
		{	// apply operator< to operands
		return (_Left < _Right);
		}
	};

贴了一段库里面的less仿函数,就是在结构体或类中重载(),实现比较功能,和函数功能相似,也返回布尔型变量,可塑性强,适用性广。用法为:

vector tmp = { 2,1,3,5,7,6,4 };
sort(tmp.begin(), tmp.end(), less());

lambda表达式

第三个参数也可以直接将lambda表达式形式直接写入,用法为:

vector tmp = { 2,1,3,5,7,6,4 };
sort(tmp.begin(), tmp.end(), [](int n1, int n2) {return n1 > n2; });

特殊情况

如果需要排序的是一个pair或一个类,sort函数默认从小到大,如果想使用其他排序方式,就需要重新定义排序函数,如果对类排序还需要在类中重载>、=、<符号!

对pair进行排序

	vector weight  = { 65,65,56,75,60,68 };;//体重
	vector height = { 100,150,90,190, 95,110 }//身高

	vector> human;
	for (int i = 0; i < 6; i++) {
		human.push_back({ height[i], weight[i] });
	}
	
	sort(human.begin(), human.end(), cmp);
	for (int i = 0; i < 6; i++) {
		cout << "体重为:" << human[i].first << "kg, " <<"身高为:"<< human[i].second << "cm" <

输出结果为:

体重为:75kg, 身高为:190cm
体重为:68kg, 身高为:110cm
体重为:65kg, 身高为:150cm
体重为:65kg, 身高为:100cm
体重为:60kg, 身高为:95cm
体重为:56kg, 身高为:90cm

我是没信号的法杖,发不出去信号,也接收不到信号。

你可能感兴趣的:(c++)