map和set容器和vector等一些容器有所不同,他们会按照key自动排序,这样很方便,但也出现了一个问题,如果使用自定义数据类型作为key值的话,你还不自己写一个排序方式,编译器不知道怎么排序,就会报错
比如下面的例子
#include<iostream>
using namespace std;
#include<map>
class Person
{
public:
Person(string name, int age)
{
this->m_Name = name;
this->m_Age = age;
}
string m_Name;
int m_Age;
};
void test02()
{
map<Person, int> m;
Person p1("刘备", 44);
Person p2("关羽", 43);
Person p3("张飞", 39);
Person p4("赵云", 33);
Person p5("马超", 36);
m.insert(pair<Person, int>(p1, 1));
m.insert(pair<Person, int>(p4, 4));
m.insert(pair<Person, int>(p5, 5));
m.insert(pair<Person, int>(p3, 3));
m.insert(pair<Person, int>(p2, 2));
for (map<Person, int>::iterator it = m.begin(); it != m.end(); it++)
{
cout << "姓名:" << (it->first).m_Name << " 年龄:" << (it->first).m_Age << " " << it->second << endl;
}
cout << "---------" << endl;
}
int main()
{
test02();
}
我们使用Person数据类型作为key值,但是其中有name和age,编译器不知道怎么区自动排序
所以我们应该加一个排序方法
#include<iostream>
using namespace std;
#include<map>
class Person
{
public:
Person(string name,int age)
{
this->m_Name=name;
this->m_Age=age;
}
string m_Name;
int m_Age;
};
class myCompare2
{
public:
bool operator()(const Person &p1,const Person &p2)
{
return p1.m_Age>p2.m_Age;
}
};
void test02()
{
map<Person,int,myCompare2> m;
Person p1("黄忠",44);
Person p2("关羽",43);
Person p3("张飞",39);
Person p4("赵云",33);
Person p5("马超",36);
m.insert(pair<Person,int>(p1,1));
m.insert(pair<Person,int>(p4,4));
m.insert(pair<Person,int>(p5,5));
m.insert(pair<Person,int>(p3,3));
m.insert(pair<Person,int>(p2,2));
for(map<Person,int,myCompare2>::iterator it=m.begin();it!=m.end();it++)
{
cout<<"姓名:"<<(it->first).m_Name<<" 年龄:"<<(it->first).m_Age<<" "<<it->second<<endl;
}
cout<<"---------"<<endl;
}
int main()
{
test02();
}
这样就会自动排序,编译器也不会报错了