如何使用map存储自定义数据类型

最简单的map的形式如下:前面的 int 为 key 值,后面的 int 为 value值,当输出 map 时,会根据key 值自动升序排序,十分地方便。

map<int,int> m1;

但是如果要使用 map 存储一些自定义的数据类型,就相对复杂一些,可以分为两种情况来讨论。

1. key 为内置数据类型 , value 为自定义数据类型

这种情况比较简单,和 map<int,int>这种最简单的 map 没有什么区别,只是将 int 换成 自定义数据类型,并且在输出 map 时进行一些改动即可。

举例:先定义一个人类,包含姓名和年龄这两个信息

class Person
{
public:
	Person(string name, int age) :m_name(name), m_age(age) {}
	string m_name;
	int m_age;
};

接下来实例化几个具体的人,将其存放在 map 的 value 中,并且将 map 的内容进行输出:

void test01()
{

	map<int, Person> m;
	Person p1("张三", 18);
	Person p2("李四", 10);
	Person p3("王五", 30);
	Person p4("赵六", 24);
	m.insert(make_pair(3, p1));
	m.insert(make_pair(4, p2));
	m.insert(make_pair(1, p3));
	m.insert(make_pair(2, p4));

	//输出map内容
	for (map<int, Person>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "key= " << it->first << "  姓名为: " << it->second.m_name << "   年龄为: " << it->second.m_age << endl;
	}
}

运行 test() 结果如下:

 可以看出,当 key 为 int 类型时,系统会根据 key 的大小自动进行升序排列。如果想要降序排列,可以在 map<int,Person> 的参数中,加入一个仿函数,让系统按照你的方式来排序 。方法如下:

 1.在函数外新建一个类,在类中定义一个仿函数,返回值为降序

class myCompare
{
public:
	bool operator()(int v1, int v2) const
	{
		//降序
		return v1 > v2;
	}
};

2.在 map 参数中添加定义了仿函数的类名

void test01()
{

	map<int, Person,myCompare> m;
	Person p1("张三", 18);
	Person p2("李四", 10);
	Person p3("王五", 30);
	Person p4("赵六", 24);
	m.insert(make_pair(3, p1));
	m.insert(make_pair(4, p2));
	m.insert(make_pair(1, p3));
	m.insert(make_pair(2, p4));

	//输出map内容
	for (map<int, Person>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "key= " << it->first << "  姓名为: " << it->second.m_name << "   年龄为: " << it->second.m_age << endl;
	}
}

运行改动后的代码,可以看出,此方法成功实现了 map 基于 key 的降序排列

完整程序如下:

#include<iostream>
#include<map>
#include<string>
using namespace std;

class Person
{
public:
	Person(string name, int age) :m_name(name), m_age(age) {}
	string m_name;
	int m_age;
};

class myCompare
{
public:
	bool operator()(int v1, int v2) const
	{
		//降序
		return v1 > v2;
	}
};
void test01()
{
	//使用map存放自定义数据类型,必须要在map参数中指定排序方式
	map<int, Person, myCompare> m;
	Person p1("张三", 18);
	Person p2("李四", 10);
	Person p3("王五", 30);
	Person p4("赵六", 24);
	m.insert(make_pair(3, p1));
	m.insert(make_pair(4, p2));
	m.insert(make_pair(1, p3));
	m.insert(make_pair(2, p4));

	//输出map内容
	for (map<int, Person>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "key= " << it->first << "  姓名为: " << it->second.m_name << "   年龄为: " << it->second.m_age << endl;
	}
}
int main()
{
	test01();
	return 0;
}

 2. key 为自定义数据类型, value 为内置数据类型

当 key 为自定义数据类型时,要注意,必须在构造 map 的时候就指定排序规则。 

第二种情况与第一种情况的区别在于:第二种情况中,排序规则必须在 map 定义的时候就写在参数列表中,否则程序无法编译生成。而第一种情况中,自定义排序规则只是为了按照自己的想法来进行 map 的输出,并不会影响程序的编译生成。

还是以第一种情况中的 Person 类来举例。由于索引 key 是“”人“”类,这个类包含了姓名和年龄两个信息。如果不自行指定排序规则的话,系统无法得知,到底是根据年龄排序,还是根据姓名字符来排序,此时编译器会报错,无法编译生成。步骤与情况1类似:

1.在函数外新建一个类,在类中定义一个仿函数,来设定排序规则,比如,根据每个人的年龄降序排列。

2.在 map 参数中添加定义了仿函数的类名。

完整的代码如下:

#include<iostream>
#include<map>
#include<iostream>
#include<string>
#include<map>
using namespace std;

class Person
{
public:
	Person(string name, int age) :m_name(name), m_age(age) {}
	string m_name;
	int m_age;
};

class myCompare
{
public:
	bool operator()(const Person& p1, const Person& p2) const
	{
		//根据年龄降序排列
		return p1.m_age > p2.m_age;
	}
};
void test01()
{
	//使用map存放自定义数据类型,必须要在map参数中指定排序方式
	map<Person, int, myCompare> m;
	Person p1("张三", 18);
	Person p2("李四", 25);
	Person p3("王五", 30);
	Person p4("赵六", 24);
	m.insert(make_pair(p1, 3));
	m.insert(make_pair(p2, 4));
	m.insert(make_pair(p3, 1));
	m.insert(make_pair(p4, 2));

	//输出map内容
	for (map<Person, int, myCompare>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "key= " << it->second << "  姓名为: " << it->first.m_name << "   年龄为: " << it->first.m_age << endl;
	}
}
int main()
{
	test01();
	return 0;
}

程序运行结果如下:按照每个人的年龄,降序排列。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值