STL自定义比较器

来源:互联网 发布:手机如何清除数据 编辑:程序博客网 时间:2024/06/05 09:13

对于下边这个结构我们需要按照age排序

struct Person{    string name;    int age;}
//自定义的比较器struct compareByAge{    bool operator()(const Person& p1,const Person p2)    {        return p1.age<p2.age;    }}
//构造vectorvector<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;    });}
原创粉丝点击