map是C++中基于红黑树的关联容器,支持键值对存储与O(log n)时间复杂度的查找、插入和删除。需包含头文件,常用操作包括insert、emplace、下标访问、find、count、遍历、erase及size等,键可自定义但需提供比较规则,注意下标访问可能默认插入。

在C++中,map 是一种非常实用的关联容器,用于存储键值对(key-value pairs),并能根据键快速查找对应的值。它底层通常基于红黑树实现,保证元素按键有序排列,且插入、删除、查找的时间复杂度为 O(log n)。下面介绍 map 的基本使用方法和常见操作。
1. 包含头文件并声明 map
使用 map 前需要包含对应的头文件:
#include然后可以通过模板参数指定键和值的类型来定义 map 对象:
std::map<:string int> studentScores; // 键为字符串,值为整数 std::map2. 插入元素
有多种方式向 map 中添加键值对:
立即学习“C++免费学习笔记(深入)”;
-
使用 insert() 方法:
studentScores.insert(std::make_pair("Alice", 95));
studentScores.insert({"Bob", 87}); -
使用下标操作符 [ ]:
studentScores["Charlie"] = 90;
注意:如果键不存在,[ ] 会自动创建一个默认值;若已存在,则覆盖原值。 -
使用 emplace() 原地构造:
studentScores.emplace("David", 82);
更高效,避免临时对象生成。
3. 访问和查找元素
获取 map 中的值主要有以下几种方式:
-
通过下标访问:
int score = studentScores["Alice"];
如果键不存在,会自动插入一个默认初始化的值(如 int 为 0),需谨慎使用。 -
使用 find() 方法判断是否存在:
auto it = studentScores.find("Alice");
if (it != studentScores.end()) {
std::cout second;
}
返回迭代器,不存在时等于 end()。 -
使用 count() 判断键是否存在(适用于 map 总是唯一键):
if (studentScores.count("Alice")) { /* 存在 */ }
4. 遍历 map
可以使用范围 for 循环或迭代器遍历所有键值对:
for (const auto& pair : studentScores) {std::cout }
或者使用显式迭代器:
for (auto it = studentScores.begin(); it != studentScores.end(); ++it) {std::cout first " second }
5. 删除元素
可通过键或迭代器删除元素:
-
按键删除:
studentScores.erase("Bob"); -
按迭代器删除:
auto it = studentScores.find("Charlie");
if (it != studentScores.end()) {
studentScores.erase(it);
} -
清空整个 map:
studentScores.clear();
6. 其他常用操作
-
获取大小:
size_t size = studentScores.size(); -
检查是否为空:
if (studentScores.empty()) { /* 无元素 */ } -
支持自定义类型作为键:
只要该类型支持比较操作(如重载 struct Person {
std::string name;
int age;
};
struct ComparePerson {
bool operator()(const Person& a, const Person& b) const {
return a.name }
};
std::mappersonMap;
基本上就这些。map 容器适合需要按键查找、排序存储的场景,掌握这些基本操作后,就能在实际项目中灵活使用了。注意避免滥用下标访问导致意外插入,默认构造可能带来副作用。不复杂但容易忽略细节。











