从一个简单的例子来看map容器使用自定义数据类型的注意事项

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();
}

这样就会自动排序,编译器也不会报错了
在这里插入图片描述

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值