最简单的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;
}
程序运行结果如下:按照每个人的年龄,降序排列。


1774

被折叠的 条评论
为什么被折叠?



