C++ Map
C++ Map
Map 存储“键/值”对的元素。
Map 中的元素
- 可以通过键(而不是索引)访问,每个键都是唯一的。
- 按键的升序自动排序。
要使用 Map,您必须包含 <map>
头文件
// 包含 map 库
#include <map>
创建 Map
要创建 Map,请使用 map
关键字,并在尖括号 <>
中指定键和值的**类型**。最后,指定 Map 的名称,例如:map<keytype, valuetype> mapName
示例
// 创建一个名为 people 的 Map,它将存储字符串作为键,整数作为值
map<string, int> people
如果您想在声明时就添加元素,请将它们放在花括号 {}
中,用逗号分隔的列表中
示例
// 创建一个 Map 来存储不同人的姓名和年龄
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
访问 Map
您无法像访问 数组和 向量那样,通过索引号来访问 Map 元素。
相反,您可以通过方括号 []
中的键来访问 Map 元素
示例
// 创建一个 Map 来存储不同人的姓名和年龄
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 获取与键“John”关联的值
cout << "John is: " << people["John"] << "\n";
// 获取与键“Adele”关联的值
cout << "Adele is: " << people["Adele"] << "\n";
自己动手试一试 »
您还可以使用 .at()
函数访问元素
示例
// 创建一个 Map 来存储不同人的姓名和年龄
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 获取与键“Adele”关联的值
cout << "Adele is: " << people.at("Adele") << "\n";
// 获取与键“Bo”关联的值
cout << "Bo is: " << people.at("Bo") << "\n";
自己动手试一试 »
注意:.at()
函数通常比方括号 []
更受欢迎,因为它会在元素不存在时抛出错误消息
示例
// 创建一个 Map 来存储不同人的姓名和年龄
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 尝试访问一个不存在的元素(将抛出异常)
cout << people.at("Jenny");
自己动手试一试 »
更改值
您还可以更改与键关联的值
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 将 John 的值从 32 更改为 50
people["John"] = 50;
cout << "John is: " << people["John"]; // 现在输出 John is: 50
自己动手试一试 »
但是,使用 .at()
函数更安全
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 将 John 的值从 32 更改为 50
people.at("John") = 50;
cout << "John is: " << people.at("John"); // 现在输出 John is: 50
自己动手试一试 »
添加元素
要向 Map 添加元素,使用方括号 []
是可以的
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 添加新元素
people["Jenny"] = 22;
people["Liam"] = 24;
people["Kasper"] = 20;
people["Anja"] = 30;
自己动手试一试 »
但您也可以使用 .insert()
函数
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 添加新元素
people.insert({"Jenny", 22});
people.insert({"Liam", 24});
people.insert({"Kasper", 20});
people.insert({"Anja", 30});
自己动手试一试 »
具有相同键的元素
Map 不能包含键相同的元素。
例如,如果我们尝试将“Jenny”添加到 Map 两次,它只会保留第一个
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 尝试添加两个键相同的元素
people.insert({"Jenny", 22});
people.insert({"Jenny", 30});
自己动手试一试 »
总结:值可以相同,但键必须唯一。
移除元素
要从 Map 中移除特定元素,可以使用 .erase()
函数
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 按键移除元素
people.erase("John");
自己动手试一试 »
要移除 Set 中的所有元素,可以使用 .clear()
函数
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 移除所有元素
people.clear();
获取 Map 的大小
要找出 Map 包含多少个元素,请使用 .size()
函数
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
cout << people.size(); // 输出 3
自己动手试一试 »
检查 Map 是否为空
使用 .empty()
函数来查看 Map 是否为空。
.empty()
函数在 Map 为空时返回 1
(true),否则返回 0
(false)
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
cout << people.empty(); // 输出 0 (不为空)
自己动手试一试 »
注意:您还可以通过使用 .count(key)
函数来检查特定元素是否存在。
如果元素存在,它返回 1
(true),否则返回 0
(false)
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
cout << people.count("John"); // 输出 1 (John 存在)
自己动手试一试 »
遍历 Map
您可以使用 **for-each** 循环遍历 Map。但是,有几点需要注意
- 您应该在
for
循环中使用auto
关键字(在 C++11 版本中引入)。这允许编译器自动确定每个键值对的正确数据类型。 - 由于 Map 元素包含键和值,您必须在循环中使用
.first
来访问键,并使用.second
来访问值。 - Map 中的元素按键的升序自动排序
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
for (auto person : people) {
cout << person.first << " is: " << person.second << "\n";
}
输出将是:
Adele is: 45
Bo is: 29
John is: 32
如果您想反转顺序,可以在尖括号中使用 greater<type>
仿函数,如下所示
示例
map<string, int, greater<string>> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
for (auto person : people) {
cout << person.first << " is: " << person.second << "\n";
}
输出将是:
John is: 32
Bo is: 29
Adele is: 45
提示:也可以使用 迭代器遍历 Map,这将在下一章中详细介绍。