C++sort排序(降序、升序)使⽤总结
⼀、升序
C++ sort 函数⼗分⽅便,可以对内置类型也可对⾃定义类型进⾏快速排序,内置类型的使⽤⽐较简单,下⾯主要讨论⾃定义类型的排序,⼀般有如下⼏种使⽤⽅法:
1.1 重载⽐较操作符
⽐如,我们现有⼀批学⽣,要根据他们的成绩进⾏升序排序,成绩如果相等则根据名字升序排序,那么我们可以如下操作:
struct Student{
string name;
int grade;
Student(string name, int grade) : name(name), grade(grade){}
bool operator < (const Student& rhs) const{
return grade < ade
|| (grade == ade && name < rhs.name);
}
friend void operator << (ostream& output, const Student& s){
output << s.name << " " << s.grade << endl;
}
};
int main()
{
vector<Student> vec;
cout << "Before:" << endl;
for(auto& s : vec){
cout << s;
}
sort(begin(vec),end(vec));
cout << endl << "After:" << endl;
for(auto& s : vec){
cout << s;
sort函数 js
}
return 0;
}
运⾏结果如下图:
1.2 ⽐较函数
当然,我们也可以⾃⼰写⽐较函数,实现如下:
bool cmp(const Student& lhs, const Student& rhs){
ade < ade
|| (ade == ade && lhs.name < rhs.name);
}
按如下⽅式调⽤:
sort(begin(vec),end(vec), cmp);
1.3 函数对象
另外⼀种⽅式,即构造⼀个函数对象,抑或叫 functor,其实就是实现了重载 operator() 的⼀个类,代码如下:
struct Compare{
bool operator()(const Student& lhs, const Student& rhs){
ade < ade
|| (ade == ade && lhs.name < rhs.name);
}
};
按如下⽅式调⽤:
sort(begin(vec),end(vec), Compare());
1.4 Lambda
C++11有了 Lambda 之后,就不必再为某些⼩函数写具名函数了,如下使⽤即可:
sort(begin(vec), end(vec), [](const Student& lhs, const Student& rhs) {
ade < ade
|| (ade == ade && lhs.name < rhs.name); });
⼆、降序
降序排序的⽅法与升序类似,如果采⽤⽐较函数、Lambda 或者⽐较函数的⽅式,只需要改⼀改⽐较条件就OK了,但是,如果对于Student类,我们定义了 operator < 之后,不想为了降序排序再定义⼀个 operator > 怎么办?两种办法!
2.1 reverse
升序排序之后,⽤ reverse 反转即可。
2.2 反向迭代
直接按如下⽅式调⽤即可,不⽤再去重载 operator > sort(vec.rbegin(), d());
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论