C++ sort函数传入比较函数的易错点

C++ sort函数传入比较函数的易错点

无论是sort函数还是stable_sort函数,在使用的时候都可以自定义的传入一个比较函数来决定从大到小排序还是从小到大排序,在死记硬背的情况下,一直是这样记忆的:

# 以比较字符串为例
bool cmp(const string& s1, const string& s2) {
	return s1 < s2; // 让字符串按字典序从小到大排列
}

那么问题来了:
如果我想要让s1和s2完全相等的情况下保持原来的排序顺序,那怎么写cmp函数呢?

首先先说易错点:
cmp函数在读取序列的两个string的时候,前一个string是给了s2,后一个string给了s1。假设有个序列:

["apple", "banana", "cat", "dog"]

那么在第一次进入cmp函数的时候,“apple”是给了s2, '‘banana’'是给了s2。因此,在比较的时候有:

bool cmp(const string& s1, const string& s2) {
	return s1 < s2; 
	等价于  return "banana" < "apple" ;(当然语法不通,实例而已)
	等价于  return false;
}

经过第一次cmp排序后,序列没有发生改变:

["apple", "banana", "cat", "dog"]
[  s2        s1 ]

因此,cmp函数返回的是false,可以推测得到有用的信息:
cmp函数返回false的结果是s2排在了s1的前面(注意s2是apple,s1是banana,s2本来就在s1之前),因此保持顺序不变。

所以可以再推测
cmp函数返回true的结果是s1排在了s2的前面,也就是会交换顺序。

由上面的结论我们可以得到之前问题的答案:
如果我想要让s1和s2完全相等的情况下保持原来的在序列中的顺序,直接让cmp函数返回false即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值