探究c++中map的自动排序问题

主要目的:

  1. 这里主要是用map对一个自定义的类进行排序,其实类似结构体的排序,但是这是在插入的过程中直接排序的。
  2. map中的保存有重复的值其实是可以更改的,一切都在那个比较函数的使用
//要求对下列结构体安装name,或则id进行排序,或者二分查找排序,使用upper_bound和lower_bound查找指定的name,id
struct student{
    string name;
    int id;
    student(string name, int id):name(name),id(id){}
};

 方法:

2.1 重写结构体的内部比较操作operator<(),在map的insert方法中,会首先查找有没有该值,如果有的话,就不插入,这个是被封装好了的,使用的<号,但是我们可以重载该方法

 

 

  1. 结构体排序
  2. 利用map内部的比较函数,
  3. value的排序

2.1 在结构体中重写operator<()操作符,这是由于map中insert在插入前会进行查找,如果找到了就返回false,不进行插入,所以这里直接重载该比较操作符,修改其中的值。因为结构体使我们自己建的,不是一些常用的类型,比如string,int这写都有类模板,但是如果出现一个新的类,程序就找不到具体要比较的值了,所以必须重写。

struct student{
    string name;
    int id;
    student(string name, int id):name(name),id(id){}

    bool operator<(const studeng &a) const{
        return this.name > a.name; //安装字典序排列
        return this.id > a.id;    //安照id从大到小
        return true;            //不比较,直接返回。这是让map可以保存相同值的关键
};


int main(){
    map<student, int> stu;
    //注意观察下面相同的值,可以以此更改上面的三个比较条件,观察输出
    stu.insert(pair<student, int>(student("yang", 2), 2));
    stu.insert(pair<student, int>(student("yang", 2), 2));
    stu.insert(pair<student, int>(student("chang", 4), 1));
    stu.insert(pair<student, int>(student("zhang", 3), 4));
    for(auto be = stu.begin(); be != stu.end(); be++){
        cout<<be->first.name<<" "<<be->first.id<<" "<<be->second<<endl;
    }

2.2 map模板在定义的时候有第三个参数就是比较函数,这里可以直接封装一个新的比较函数取代他,默认的也是用<号来实现的, 即:less<key>

struct student{
    string name;
    int id;
    student(string name, int id):name(name),id(id){}

    bool operator<(const studeng &a) const{
        return this.name > a.name; //安装字典序排列
        return this.id > a.id;    //安照id从大到小
        return true;            //不比较,直接返回。这是让map可以保存相同值的关键
};

struct compare_id{
    bool operator()(const student &a, const student &b){
        return a.id > b.id;//这里可以同上面一样的三中设置
    }
};
int main(){
    map<student, int, compare_id> stu;
    //注意观察下面相同的值,可以以此更改上面的三个比较条件,观察输出
    stu.insert(pair<student, int>(student("yang", 2), 2));
    stu.insert(pair<student, int>(student("yang", 2), 2));
    stu.insert(pair<student, int>(student("chang", 4), 1));
    stu.insert(pair<student, int>(student("zhang", 3), 4));
    for(auto be = stu.begin(); be != stu.end(); be++){
        cout<<be->first.name<<" "<<be->first.id<<" "<<be->second<<endl;
    }
}

//这里可以比较1和2两种方法,哪个先执行,或者二者同时存在时,第二个先执行,第一种不执行。
  1. 对map中的value进行排序。这个需要借助sort函数,说白了就是结构体排序
struct student{
    string name;
    int id;
    student(string name, int id):name(name),id(id){}

    bool operator<(const studeng &a) const{
        return this.name > a.name; //安装字典序排列
        return this.id > a.id;    //安照id从大到小
        return true;            //不比较,直接返回。这是让map可以保存相同值的关键
};

struct compare_id{
    bool operator()(const student &a, const student &b){
        return a.id > b.id;//这里可以同上面一样的三中设置
    }
};

/*结构体排序*/
bool com_second(const pair<student, int>&a, const pair<student, int>&b){
    return a.second > b.second;

}

int main(){
    map<student, int, compare_id> stu;
    //注意观察下面相同的值,可以以此更改上面的三个比较条件,观察输出
    stu.insert(pair<student, int>(student("yang", 2), 2));
    stu.insert(pair<student, int>(student("yang", 2), 2));
    stu.insert(pair<student, int>(student("chang", 4), 1));
    stu.insert(pair<student, int>(student("zhang", 3), 4));
    for(auto be = stu.begin(); be != stu.end(); be++){
        cout<<be->first.name<<" "<<be->first.id<<" "<<be->second<<endl;
    }
    vector<pair<student,int>> ve(stu.begin(), stu.end());
    sort(ve.begin(), ve.end(), com_second);

    cout<<endl;
    for(auto be = ve.begin(); be != ve.end(); be++){
        cout<<be->first.name<<" "<<be->first.id<<" "<<be->second<<endl;
    }

可以在电脑上运行,查看结果

    原文作者:ypp1
    原文地址: https://blog.csdn.net/qq_24279775/article/details/96483969
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞