c++ STL map容器自定义排序规则

 

一、c++内置类型数据(int,float,double....)

#include <bits/stdc++.h>
using namespace std;

// map容器
void test01()
{
    map<int, string> m;
    // map的几种初始化操作
    m.insert(make_pair(5, "hhh"));
    m.insert(pair<int, string>(3, "lll"));
    m.emplace(4, "ggg");
    m[1] = "abc";

    //默认排序输出
    for (map<int, string>::iterator it = m.begin(); it != m.end(); ++it)
    {
        cout << "key:" << it->first << " value:" << it->second << endl;
    }
}

int main()
{
    test01();
    return 0;
}
运行结果:

默认通过key值从小到大排序 

自定义排序规则通常是将升序改为降序

 

1.通过c++自定义的模板函数对象改变排序规则

声明时加入greater<T1>,使用时应加入头文件<functional>,或者使用万能头文件<bits/stdc++.h>

例如上面的程序map改变声明为

map<int,string,greater<int>>m;

输出结果变为

 

 2.通过自定义函数对象改变排序规则

定义比较类如下,通过在类中重载operator()实现函数对象的功能

class Compare
{
public:
    bool operator()(int v1, int v2)
    {
        return v1 > v2;
    }
};

重新将声明改为

map<int,string,Compare>m;

输出结果如下

 

 

二、自定义数据类型


#include <bits/stdc++.h>
using namespace std;

// map容器
class Student
{
public:
    int age;
    string name;

    Student() {}
    Student(string name, int age)
    {
        this->name = name;
        this->age = age;
    }
};


//年龄从大到小排,姓名从前往后排
class Comp
{
public:
    bool operator()(const Student &s1, const Student &s2)
    {
  if (s1.age == s2.age)
            return s1.name < s2.name;
        return s1.age > s2.age;
    }
};

void test02()
{
    map<Student, string, Comp> m;
    m.insert(make_pair(Student("aaa", 19), "班长"));
    m.insert(make_pair(Student("bbb", 19), "学习委员"));
    m.insert(make_pair(Student("ccc", 20), "团支书"));
    m.insert(make_pair(Student("ddd", 35), "老师"));
    //输出
    for (auto it = m.begin(); it != m.end(); ++it)
    {
        cout << "姓名:" << it->first.name << " 年龄:" << it->first.age << " 职务:" << it->second << endl;
    }
}

int main()
{
    test02();
    return 0;
}

输出结果:

 

....待续

 

posted @ 2022-03-18 21:32  深情的山鸡  阅读(1263)  评论(0编辑  收藏  举报