sort()的基本应用

sort()是C++ STL里面一个非常棒的函数,不仅是一个模板函数,还可以自动根据数据多少选择最佳的排序方式。

#include <algorithm>
using namespace std;
sort(a, a + n, cmp);

sort()一共可以接收三个参数:
第一个是首地址,如果是数组的话,去掉下标即可。如a[1000]的首地址为a[0]或者a。
第二个参数为数据范围,或者说尾地址更确切一下。如果要对a[1000]进行排序,如果是范围的话,那么只需要写1000即可。但是我们填写的参数往往是a + 1000。如果是对一个string变量s进行排序,我们可以直接使用s.end()作为第二个参数。
第三个参数作为扩展可以实现更强大的功能。
比如sort()默认是对数据进行升序排序,但是我们可以通过第三个参数,将其变为降序排序。
还有当我们对某种复合类型进行排序时,往往会有多种排序依据,我们可以通过第三个参数来指定根据复合类型的具体的数据进行排序。
下面是sort()的使用举例:

#include <algorithm>
using namespace std;

//对a[1000]进行升序排序
sort(a, a + 1000);

//对a[1000]中的N个数据进行升序排序
sort(a, a + N);

//对a[1000]中的N个数据进行降序排序  使用第三个参数
bool cmp(int a, int b)
{
	return a > b;
}
sort(a, a + N, cmp);

//对string变量s的排序
sort(s.begin(), s.end());
//或者是
sort(s, s.end());


//结构体的排序
//定义了一个名为boy的结构体,三种数据类型为string name, int age, double height;
struct boy{
	string name;
	int age;
	double height;
};
boy b[1000];

//对名字进行排序
bool cmp1(boy b1, boy b2) {
	return b1.name > b2.name;
}
sort(b, b + N, cmp1);//可以根据boy的name属性进行降序排序

//
bool cmp2(boy b1, boy b2) {
	return b1.age < b2.age;
}
sort(b, b + N, cmp2);//可以根据boy的age属性进行升序排序

//
bool cmp3(boy b1, boy b2) {
	return b1.height > b2.height;
}
sort(b, b + N, cmp3);//可以根据boy的height属性进行降序排序

2021.2.9 扩充内容
如果你已经看懂了上面所有的内容,那么你可以看一下下面这些内容。

sort()其实是基于迭代器的排序函数,也就是说它只对地址进行操作,而不是对容器进行操作,所以它才不会受容器或者元素类型的限制。

关于sort()函数的第三个参数,实际上是一个谓词——一个可以调用的表达式,其返回结果是一个能用作条件的值。
如果你觉得上面利用cmp作为第三个参数的形式并不美观,那么你完全可以使用lambda表达式来进行替换。
关于lambda表达式在这里不细说,以后另外开个帖子好好说一下吧。

但是你必须要知道lambda表达式只有C++11以上的版本才支持。

比如上面那个对a[1000]的数组进行排序的例子,可以改写为以下

int a[1000];
sort(a, a + n, [](int a, int b) {return a > b;}); 
//[]是捕获列表,其他内容都与函数一样,只不过需要注意的是lambda表达式使用尾置返回指定返回类型。
//也就是说返回类型可以隐藏,由编译器自动判别。但是你一定要指定返回类型的话,可以写成下面这个样子。
sort(a, a + n, [](int a, int b) -> bool {return a > b;});

除了以上这些内容之外,继续补充一个sort的用法:根据字符串长短排序。

//法一:
bool cmp(const string &s1, const string &s2) {
	return s1.size() > s2.size();
}
string s[1000];
sort(s, s + n, cmp);
//法二:
bool cmp(string &s1, string &s2) {
	return s1.size() > s2.size();
}
string s[1000];
sort(s, s + n, cmp);
//法三:
string s[1000];
sort(s, s + n, [] (const string &s1, const string &s2) {return s1.size() > s2.size();} );
//法四:
string s[1000];
sort(s, s + n, [] (string &s1, string &s2) {return s1.size() > s2.size();} );

上面四种方法都可以达到我们想要的目的,但是我最推荐的还是第1种和第3种。下面是我写的测试代码以及测试结果。

#include <bits\stdc++.h>
#define ll long long
#define ld long double
using namespace std;
bool cmp(const string &s1, const string &s2) {
	return s1.size() > s2.size();
}
bool cmp1(string &s1, string &s2) {
	return s1.size() < s2.size();
}
int main() {
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	string s[1000];
	int n;
	while(cin >> n) {
		for(int i = 0; i < n; ++ i) cin >> s[i]; //随便读入n个长短不一的字符串
		sort(s, s + n, cmp);//使用方法一将字符串按照由长到短排序,并输出
		for(int i = 0; i < n; ++ i) cout << s[i] << endl;
		sort(s, s + n, cmp1);//使用方法二将字符串按照由短到长排序,并输出
		for(int i = 0; i < n; ++ i) cout << s[i] << endl;
		sort(s, s + n, [] (const string &s1, const string &s2) {return s1.size() > s2.size();} );//使用方法三将字符串按照由长到短排序,并输出
		for(int i = 0; i < n; ++ i) cout << s[i] << endl;
		sort(s, s + n, [] (string &s1, string &s2) {return s1.size() < s2.size();} );//使用方法四将字符串按照由短到长排序,并输出
		for(int i = 0; i < n; ++ i) cout << s[i] << endl;
	}
	return 0;
}

在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿扬来了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值