主要目的:
- 这里主要是用map对一个自定义的类进行排序,其实类似结构体的排序,但是这是在插入的过程中直接排序的。
- 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方法中,会首先查找有没有该值,如果有的话,就不插入,这个是被封装好了的,使用的<号,但是我们可以重载该方法
- 结构体排序
- 利用map内部的比较函数,
- 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两种方法,哪个先执行,或者二者同时存在时,第二个先执行,第一种不执行。
- 对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;
}
可以在电脑上运行,查看结果