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即可。