所有自定义排序都为按需求设计自定义函数和自定义类
一:sort()
对algorithm头文件中sort()和list容器自带的sort()均可用
//方式一
bool cmp(int a, int b) {
return a>b;
}
vector<int> v;
sort(v.begin(), v.end(), cmp);
//方式二
class cmp2 {
public:
bool operator()(int a, int b) {
return a>b;
}
};
sort(v.begin(), v.end(), cmp2());
//方式三
sort(v.begin(), v.end(), greater<int>());
对于类对象
class Person {
private:
string name;
public:
Person(string _name): name(_name) {}
string getName() {
return name;
}
//方式一
bool operator<(const Person& p)const {
return name<p.name;
}
};
vector<Person> vec;
sort(vec.begin(), vec.end());
//方式二
bool cmp2(const Person& p1, const Person& p2)const {
return p1.getName() < p2.getName();
}
sort(vec.begin(), vec.end(), cmp2);
//方式三
class cmp {
public:
bool operator()(Person p1, Person p2) {
return p1.getName() < p2.getName();
}
};
sort(vec.begin(), vec.end(), cmp()):
二:set,map自定义排序
对于非类对象:
set<int, greater<int> >s; 逆序 less<int> 升序
map<int, int, greater<int> > m; 对key排序,逆序
class Person {
private:
string name;
public:
Person(string _name): name(_name) {}
string getName()const {
return name;
}
方式一
bool operator<(const Person& p)const {
return name>p.name;
}
};
set<Person> s;
//方式二
class cmp {
public:
bool operator()(const Person& p1, const Person& p2)const {
return p1.getName() > p2.getName();
}
};
set<Person, cmp> s2;