要对vector中的元素进行排序,sort函数就必须比较其中的元素。它使用<操作符来比较需要排序的vector对象中的任意类型的元素。之所以可以在vector<double>中使用sort函数是因为<操作符可以比较两个double的值,但是不能比较自定义的对象。
sort函数中提供了第三个参数,这个参数叫做谓词。谓词是一个可调用的表达式,其返回结果是一个能用作条件的值,它是可以产生真假值的函数,真假值的典型类型就是bool值。如果提供了第三个参数,sort函数就会按照它来比较自定义对象中的元素。
自定义一个类,此时就不能单纯的用sort两个参数来进行排序。
struct MyClass{
string name;
int age;
};
自定义排序的规则。
bool compare(const MyClass &m1,const MyClass &m2){
return m1.age<m2.age;
}
完整代码
#include <iostream>
#include <vector>
#include <algorithm>
using std::cout;
using std::endl;
using std::string;
using std::vector;
using std::sort;
using std::ostream;
struct MyClass{
string name;
int age;
};
bool compare(const MyClass &m1,const MyClass &m2){
return m1.age<m2.age;
}
ostream &operator<<(ostream &cout,MyClass &m){
cout<<"Name: "<<m.name<<", age: "<<m.age;
return cout;
}
int main(){
vector<MyClass> Mc;
MyClass m1;
MyClass m2;
MyClass m3;
m1.name="L";m1.age=18;
m2.name="X";m2.age=20;
m3.name="Z";m3.age=19;
Mc.push_back(m1);
Mc.push_back(m2);
Mc.push_back(m3);
for(auto e:Mc){
cout<<e<<endl;
}
cout<<"After sort"<<endl;
sort(Mc.begin(),Mc.end(),compare);
for(auto e:Mc){
cout<<e<<endl;
}
}
运行结果
sort函数第三个参数应该是传递一个排序规则的函数,但对于这种不需要复用,且短小的函数,直接传递函数体可以增加代码的可读性,可以直接将排序函数的实现写在应该传递函数的位置,省去了定义排序函数的过程。
sort(Mc.begin(),Mc.end(),[](MyClass &m1,MyClass &m2){
return m1.age<m2.age;
}
);