本文将对关联容器中map的基本用法加以介绍,其内容摒弃全面性而注重实用性。对于更加详尽的讲解,请参考《C++ Primer》第五版第11章。
1. 什么是map?
map是一种数据结构。正如map一词在英文中的含义,它表示一种“映射”关系,具体来说就是将“关键字(key)”映射到“值(value)”。换言之,map即若干“关键字-值”对组成的集合。
map类型通常被称为“关联数组(associative array)”,它与一般的数组类似,不同之处在于其“下标”(关键字)不必是整数。
map不允许重复关键字,且对存入的元素按照关键字有序存储。在默认情况下,标准库使用关键字类型的 < 运算符来比较两个关键字,并按照升序进行存储。若关键字类型为自定义类型,则必须给出合法的比较函数。
2. map的定义与初始化
(1) map<关键字类型, 值类型> 名称; //定义一个空map
例1:定义一个名为mp的map,其关键字为string类型,值为整型。
map<string, int> mp;
(2) map<关键字类型, 值类型> 名称 = {{关键字1, 值1}, {关键字2, 值2}, ...}; //定义并初始化一个map
例2:定义并初始化一个名为mp的map,初始化时不必按照关键字的升序书写,value允许重复。
map<string, int> mp = {{"Alhaitham", 48}, {"Zhongli", 43}, {"Diluc", 49}, {"Albedo", 43}};
3. 向map添加元素
名称.insert({关键字, 值}); //向map中添加一个元素,只有当关键字不在map中时才插入
注:insert()函数的返回值为一个pair类型:pair.first为指向具有给定关键字的元素的迭代器,pair.second为bool类型,指出插入操作是否成功,即若该关键字已经存在则pair.second为false,表示未能成功插入。
例3:
map<string, int> mp = {{"Alhaitham", 48}, {"Zhongli", 43}, {"Diluc", 49}, {"Albedo", 43}};
auto ret1 = mp.insert({"Tighnari, 44"}); //ret1.second == true
auto ret2 = mp.insert("Diluc", 49); //ret2.second == false
4. 从map删除元素
名称.erase(关键字); //从map中删除具有给定关键字的元素,返回删除的元素数量(1或0)
例4:
map<string, int> mp = {{"Alhaitham", 48}, {"Zhongli", 43}, {"Diluc", 49}, {"Albedo", 43}};
int num1 = mp.erase("Albedo"); //num1 == 1
int num2 = mp.erase("Xiao"); //num2 == 0
5. map的下标操作
名称[关键字]; //返回具有给定关键字的元素的值,若该关键字不在map中则创建一个新元素并初始化(值默认为0)
例5:将“Alhaitham”对应的值更改为48,并添加一个新元素{"Tighnari, 44"}。
map<string, int> mp = {{"Alhaitham", 25}, {"Zhongli", 43}, {"Diluc", 49}, {"Albedo", 43}};
mp["Alhaitham"] = 48;
mp["Tighnari"] = 44;
使用此方法添加元素相较于insert()函数更为简洁。
6. 在map中查找元素
名称.count(关键字); //返回具有给定关键字的元素的数量(1或0)
例6:
map<string, int> mp = {{"Alhaitham", 48}, {"Zhongli", 43}, {"Diluc", 49}, {"Albedo", 43}};
int num1 = mp.count("Alhaitham"); //num1 == 1
int num2 = mp.count("Tighnari"); //num2 == 0
7. 遍历map中的元素
2017年发布的C++ 17标准提供了一种不使用迭代器的简洁方法。
for(auto [key, value]: 名称) { cout << key << " " << value << endl; } //依次输出每个元素的关键字和值
例7:
map<string, int> mp = {{"Alhaitham", 48}, {"Zhongli", 43}, {"Diluc", 49}, {"Albedo", 43}};
for(auto [key, value]: mp)
{
cout << key << " " << value << endl;
}