自定义结构体在map中的排序方式

在sort中,我们可以写一个cmp的排序bool函数,再加入sort中
如sort(a,a+n,cmp)

在map中,如果key是int或string,这个map会自动进行排序,如果key是一个定义的结构体,这时我们就需要一个排序规则,

所以我们这样写试试

map<people,int,cmp>m;

果然,编译不过去。
看来,写一个cmp函数的办法是行不通的
那我们怎么对key是结构体的map排序呢?
这里我写了两种,原理都一样,比较简单,当然也有其他的写法,其实原理都是一样的,对它进行重载
第一种

struct people
{
    int num;
    int x;
};
bool operator <(const people &a,const people &b)
{
        return a.x>b.x;
};

我们定义了我们的结构体后,我们就给他一个排序的规则,这样我们只要是这个规则里的结构体(这里的people),不管他到了天涯海角,代码的任何地方,他都会依据这个规则来进行排序。

第二种
看起来更简洁

struct people
{
    int num;
    int x;
    friend bool operator <(const people &a,const people &b)
    {
        return a.x>b.x;
    }
};

我们在定义结构体中就加入排序规则,代码和刚刚的几乎一样,把刚刚bool中的东西全部搬到上面来,在前面加一个friend,去掉多余的那一个分号,就ok了!

其实,这两种办法不仅是在map中有用,只要是需要结构体排序的,都可以不用写cmp,直接在定义他的时候就可以加上。

所以,如果我们是这样定义结构体的,我们写sort就可以直接写sort(a,a+n),是不是很棒呢!
当然,我们也要具体题目具体分析,有的题目要求你先用这种排序,再用另一种排序,就老老实实写两个cmp来sort吧,这仅实用于结构体只有一种要求的排序情况。

发布了44 篇原创文章 · 获赞 13 · 访问量 2337

猜你喜欢

转载自blog.csdn.net/NEFU_kadia/article/details/104350652