C++ 映射
C++ 映射
映射存储元素为“键/值”对。
映射中的元素
- 可以通过键访问(不是索引),每个键都是唯一的。
- 自动按键的升序排序。
要使用映射,您必须包含 <map>
头文件
// 包含映射库
#include <map>
创建映射
要创建映射,请使用 map
关键字,并指定它应该存储的键和值的类型,在尖括号 <>
中。最后,指定映射的名称,例如:map<keytype, valuetype> mapName
示例
// 创建一个名为 people 的映射,它将字符串作为键,整数作为值存储
map<string, int> people
如果您想在声明时添加元素,请将它们放在逗号分隔的列表中,放在花括号 {}
内
示例
// 创建一个映射,用于存储不同人员的姓名和年龄
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
访问映射
您不能通过引用索引号来访问映射元素,就像您对 数组 和 向量 所做的那样。
相反,您可以通过在方括号 []
内引用其键来访问映射元素
示例
// 创建一个映射,用于存储不同人员的姓名和年龄
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<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<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 尝试访问一个不存在的元素(将抛出异常)
cout << people.at("Jenny");
自己尝试 »
更改值
您还可以更改与键关联的值
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 将 John 的值更改为 50,而不是 32
people["John"] = 50;
cout << "John is: " << people["John"]; // 现在输出 John is: 50
自己尝试 »
但是,使用 .at()
函数更安全
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 将 John 的值更改为 50,而不是 32
people.at("John") = 50;
cout << "John is: " << people.at("John"); // 现在输出 John is: 50
自己尝试 »
添加元素
要向映射添加元素,可以使用方括号 []
示例
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});
自己尝试 »
具有相同键的元素
映射不能包含具有相同键的元素。
例如,如果我们尝试将“Jenny”两次添加到映射中,它将只保留第一个
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 尝试添加两个具有相同键的元素
people.insert({"Jenny", 22});
people.insert({"Jenny", 30});
自己尝试 »
总结; 值可以相等,但键必须唯一。
删除元素
要从映射中删除特定元素,可以使用 .erase()
函数
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 通过键删除元素
people.erase("John");
自己尝试 »
要从集合中删除所有元素,可以使用 .clear()
函数
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 删除所有元素
people.clear();
查找映射的大小
要查找映射有多少个元素,请使用 .size()
函数
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
cout << people.size(); // 输出 3
自己尝试 »
检查映射是否为空
使用 .empty()
函数来确定映射是否为空。
如果映射为空,.empty()
函数返回 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 存在)
自己尝试 »
遍历映射
您可以使用 for-each 循环遍历映射。但是,需要注意几件事
- 您应该在
for
循环中使用auto
关键字(在 C++ 版本 11 中引入)。这使编译器可以自动确定每个键值对的正确数据类型。 - 由于映射元素由键和值组成,因此您必须包含
.first
来访问键,并在循环中包含.second
来访问值。 - 映射中的元素自动按键的升序排序
示例
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
提示: 也可以使用 迭代器 遍历映射,您将在下一章中详细了解迭代器。