map容器和set容器自带排序操作,但是,对于自定义数据类型,二者必须指定排序规则。本文以map容器为例,针对自定义数据类型作为key值的指定排序进行程序实现。
首先,自定义数据类型:Person类,该类将会作为key值
class Person
{
public:Person(string name, int age){this->m_name = name;this->m_age = age;}string m_name;int m_age;
};
之后,指定排序规则,注意,这里的operator()不能直接作为全局函数,因此需要将其写在类中或者结构体中。
class classCompare
{
public:bool operator()(Person p1, Person p2){return p1.m_age > p2.m_age;}
};
最后,在测试函数中进行排序和排序后的打印操作
void test05()
{map<Person, int, classCompare> mp;Person p1("c",2);Person p2("a",1);Person p3("b",3);Person p4("d",2);mp.insert(pair<Person,int>(p1,10));mp.insert(pair<Person,int>(p2,20));mp.insert(pair<Person,int>(p3,30));mp.insert(pair<Person,int>(p4,40));map<Person, int, classCompare>::iterator it;for(it=mp.begin(); it!=mp.end(); it++){cout << it->first.m_name << " " << it->first.m_age << " " << it->second << endl;}}
注意:
1、如果想要让Person对象在其他上下文中也可以使用默认的<比较,你可以在Person结构体内部重载<运算符,这样做的话,就不需要在创建map时指定比较函数了。
2、如果想要在不同的上下文中使用不同的排序规则,使用单独的比较函数对象会更加灵活。
下图是程序运行后的效果