对于下边这个结构我们需要按照age排序
struct Person
{
string name;
int age;
}
//自定义的比较器
struct compareByAge
{
bool operator()(const Person& p1,const Person p2)
{
return p1.age<p2.age;
}
}
//构造vector
vector<Person>vec{p1,p2....};
sort(vec.begin(),vec.end(),compareByAge());//排序传入我们自定义的比较器
map按照value排序
map内部的实现使用的是树,不能够直接排序,我们可以将其放在一个vector中,然后自定义一个比较器去排序
map<string,int>mapTest;
mapTest["zhangsan"]=2;
mapTest["lisi"]=3;
...
vector<pair<string,int>>vec{mapTest.begin(),mapTest.end()};//初始化vector
//定义比较器
struct compare
{
bool operator()(const pair<string,int>&p1,const pair<string,int>&p2)
{
return p1.second<p2.second;//second为value
}
}
//排序
sort(vec.begin(),vec.end(),compare());//调用自己的比较器函数
我们来看一个实例:
struct ptr_compare//自定义比较器按照key中的指针指向的内容排序
{
bool operator()(const shared_ptr<string>&p1,const shared_ptr<string>&p2)
{
return *p1>*p2;
}
};
struct comp//自定义比较器按照value排序
{
bool operator()(const pair<shared_ptr<string>,string>&p1,const pair<shared_ptr<string>,string>&p2)
{
return p1.second<p2.second;
}
};
int main()
{
map<shared_ptr<string>,string,ptr_compare>ptr_map;//按照key中的指针指向的数据排序
shared_ptr<string>s1{new string{"hello"}};
shared_ptr<string>s2{new string{"world"}};
shared_ptr<string>s3{new string{"just"}};
shared_ptr<string>s4{new string{"for"}};
shared_ptr<string>s5{new string{"test"}};
ptr_map[s1]="0";
ptr_map[s2]="1";
ptr_map[s3]="2";
ptr_map[s4]="3";
for_each(ptr_map.begin(),ptr_map.end(),[](pair<shared_ptr<string>,string>p)
{
cout<<*p.first<<" "<<p.second<<endl;
});
vector<pair<shared_ptr<string>,string>>vec(ptr_map.begin(),ptr_map.end());//将map中的pair数据放到vector中
sort(vec.begin(),vec.end(),comp());//使用自定义比较器
for_each(vec.begin(),vec.end(),[](pair<shared_ptr<string>,string>p){
cout<<*p.first<<" "<<p.second<<endl;
});
}