c++中的map是基于红黑树的关联容器,自动按键排序,支持O(log n)查找、插入和删除。需包含头文件<map>,定义为map<KeyType, ValueType>,可使用{}初始化。通过下标[]访问会自动创建默认值,insert()和emplace()更安全高效。查找用find()或count(),删除用erase()。元素按键升序排列,可用范围for或迭代器遍历。常用操作包括size()、empty()、clear()等。键类型需支持比较,自定义类型需提供比较规则。

C++ 中的 map 是标准模板库(STL)中非常实用的关联容器,它以键值对(key-value pair)的形式存储数据,并自动根据键进行排序。map 的底层通常基于红黑树实现,因此查找、插入和删除操作的时间复杂度为 O(log n),适用于需要快速查找和有序遍历的场景。
map 的基本定义与初始化
要使用 map,需要包含头文件 <map>。其模板参数有两个:键类型(key)和值类型(value)。
基本语法:
map<KeyType, ValueType> variableName;
示例:
立即学习“C++免费学习笔记(深入)”;
支持直接初始化(C++11 起):
map<string, int> scores = {{“Alice”, 95}, {“Bob”, 87}, {“Charlie”, 90}};
插入与访问元素
- 下标操作符 [ ]:通过键访问对应的值。若键不存在,则自动创建并用默认值初始化。
- insert() 方法:更安全地插入,避免意外创建元素。
- emplace():原地构造,效率更高。
studentScores[“Alice”] = 95;
cout << studentScores[“Alice”]; // 输出 95
studentScores.insert(make_pair(“David”, 88));
// 或使用 { }
studentScores.insert({“Eve”, 92});
studentScores.emplace(“Frank”, 85);
注意:使用 [ ] 访问不存在的键会自动插入该键并赋予默认值(如 int 为 0),可能影响判断逻辑。
查找与删除元素
map 提供了高效的查找方法:
- find(key):返回指向该键值对的迭代器,未找到则返回 end()。
- count(key):返回 1(存在)或 0(不存在)。map 中键唯一,所以最多返回 1。
auto it = studentScores.find(“Alice”);
if (it != studentScores.end()) {
cout << “Score: ” << it->second;
}
if (studentScores.count(“Bob”)) {
cout << “Bob exists”;
}
删除元素使用 erase():
- erase(key):按键删除。
- erase(iterator):按迭代器删除。
studentScores.erase(“Bob”);
studentScores.erase(it); // it 为有效迭代器
遍历 map
map 中的元素按键升序排列,可使用迭代器或范围 for 循环遍历:
for (const auto& pair : studentScores) {
cout << pair.first << “: ” << pair.second << endl;
}
也可使用传统迭代器:
for (auto it = studentScores.begin(); it != studentScores.end(); ++it) {
cout << it->first << ” -> ” << it->second << endl;
}
其他常用操作
- size():返回元素个数。
- empty():判断是否为空。
- clear():清空所有元素。
- begin()/end():获取首尾迭代器。
例如:
if (!studentScores.empty()) {
cout << “Total students: ” << studentScores.size();
}
基本上就这些。map 在处理键值映射时非常直观高效,掌握它的基本用法能显著提升 C++ 编程效率。注意键的类型必须支持比较操作(如 <),自定义类型需重载比较函数或提供比较器。不复杂但容易忽略细节。


