C++ sort函数中缺省cmp的理解与使用

这个缺省的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;
}
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

最辣の鸡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值