STL自定义比较器

对于下边这个结构我们需要按照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;
    });

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值