这个缺省的cmp看了道题就把我唬住了,折腾了一晚上才搞明白 ,写个博客记录下
sort函数的语法是sort(start, end, cmp), 其中,start和end是排序对象的首地址与尾地址的后一位。注意end是尾地址的后一位。注意end是尾地址的后一位。这不是bug是重说三
cmp在缺省下默认为升序排列。比如一个数组a[10],sort(a, a + 10) 后原来的数组就变成升序的了。注意end是尾地址的后一位。(第四遍)
下面开始盘cmp:(正文开始 )
cmp是一个布尔型函数,sort函数在运行过程中会不断传入两个参数调用cmp(划重点:这里的两个参数前者的位置在后者前面)。若cmp为true,则sort不调换传入的两个参数的位置,反之,sort会调换之。
不考虑cmp的泛型编程(即参数类型不确定的编程方式,今天刚学的名词活学活用欸嘿) ,只拿int举例,缺省状态下cmp默认为以下函数:
`bool cmp (int a, int b) {
if (a < b) return true;
return false;
}`
或者可以简单写成:
bool cmp (int a, int b) {
return a < b;
}`
也就是说,传入的两个参数a,b,如果 a < b ,则cmp为true,不必调换二者位置,一套下来自然是逐个增大的,也就是升序排列。
可如果我们自己定义cmp,使用这一个缺省函数,则又会有新的化学反应。比如稍微改一下cmp:
bool cmp (int a, int b) {
if (a > b) return true;
return false;
}
这时,当数组前面的数较小的时候,cmp就不满意了,亮出false,把前面这个较小的数往后放,最后导致了sort函数变成了降序排列的了。
当然,sort函数中的cmp还有许许多多妙用,本文只是介绍了最基础的两种,能让sort实现升序与降序两种功能(把int换成double、char啥啥啥的效果也是一样的)。
应用(题自洛谷):
这道题就可以用sort函数来做,我们先建立一个string组s[25],用来接收这n个整数。我们希望把这n个string按如下方式排列:
对于每一个s[i],s[i]与s[i + 1]拼起来之后总要大于s[i + 1]与s[i + 2]拼起来的数,这样排列后只要把这n个s逐个输出就可以了。
代码如下:
#include<bits/stdc++.h>
using namespace std;
string s[25];
int n;
bool cmp (string a, string b) {
return a + b > b + a;//让每个在前面大的s向前放
}
int main()
{
cin >> n;
for (int i = 1; i <= n; ++i) cin >> s[i];
sort(s + 1, s + n + 1, cmp);
for (int i = 1; i <= n; ++i) {
cout << s[i];
}
return 0;
}