sort 语法细节总结
sort(first,last,comp)
对给定区间[first,last)
进行排序,注意此处包括first
但是不包括last
,其中comp
可自定义排序依据。
其中comp
需要满足一定要求,具体如下:
比较函数对象(即满足比较 (Compare) 概念的对象),若第一参数小于(即先序于)第二参数则返回 true ,否则返回false。
比较函数的签名应等价于如下者:
bool cmp(const Type1 &a, const Type2 &b);
签名不必拥有 const &
,但函数对象必须不修改传递给它的对象。
类型 Type1
与 Type2
必须使得RandomIt
类型的对象能在解引用后隐式转换到这两个类型。
其中comp具有如下表要求:
表达式 | 返回类型 | 要求 |
---|---|---|
comp(a,b) | 可隐式转换为bool | 建立有下列属性的严格弱序关系。 1、对于所有a, comp(a,a)==false 1、若 comp(a,b)==true 则comp(b,a)==false 3、若 comp(a,b)==true 且comp(b,c)==true 则comp(a,c)==true |
例如:
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a,int b){
return a>b; //此时为升序排列,如果写成a<b则为降序排列
}
int main(){
vector<int> nums={2,6,4,7};
sort(nums.begin(),nums.end(),cmp);
return 0;
}
此时容器中的数字将按照升序排列
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a,int b){
return a>=b; //此时为升序排列,如果写成a<b则为降序排列
}
int main(){
vector<int> nums={2,6,4,7};
sort(nums.begin(),nums.end(),cmp);
return 0;
}
上述代码在有数字相同时无法正常运行。由于cmp返回时若a==b,则comp(a,b)==true
且comp(b,a)==true
与上述表格中要求comp(a,a)==false
相违背,顾程序无法正常运行。
通俗解释为,sort依据comp返回值判定a是否应该排在b的前面,返回true则a在b前,由于comp(a,b)==true
且comp(b,a)==true
则a在b前,b在a前,产生歧义。排序出现异常。