map是C++ STL中基于红黑树的关联容器,支持唯一键的自动排序和O(log n)时间复杂度的查找、插入与删除。可通过默认构造、初始化列表、拷贝构造创建,常用insert、emplace或下标操作插入元素;推荐用find或at访问以避免下标访问导致的意外插入;可用erase按键或迭代器删除元素,clear清空;支持范围for和迭代器按键升序遍历;常用于统计单词频次等需键值映射的场景,如示例中用wordCount[word]++统计各单词出现次数并输出结果。

map 是 C++ STL 中一种非常实用的关联容器,用于存储键值对(key-value pairs),其中每个键唯一且自动排序。它基于红黑树实现,查找、插入和删除操作的时间复杂度为 O(log n),适合需要快速查找和有序遍历的场景。
构造与初始化
map 可以通过多种方式创建和初始化:
- 默认构造:创建一个空 map
- 初始化列表(C++11 起)
- 拷贝构造
std::map
std::map
立即学习“C++免费学习笔记(深入)”;
std::map
插入元素
向 map 中添加键值对有几种常用方法:
-
insert 方法:返回 pair
,bool 表示是否插入成功 - 下标操作符 [ ]:若键不存在则创建并默认初始化值,存在则返回引用
- emplace (C++11):原地构造,更高效
myMap.insert({4, "David"});
myMap.insert(std::make_pair(5, "Eve"));
myMap[6] = "Frank";
myMap.emplace(7, "Grace");
访问与查找元素
获取 map 中的值需注意安全性和效率:
- 使用下标 [ ]:可读可写,但若键不存在会自动插入默认值,可能引起意外行为
- 使用 at():带边界检查,键不存在时抛出 std::out_of_range 异常
- find() 方法:推荐用于判断键是否存在
- count() 方法:返回 0 或 1(map 键唯一)
std::string name = myMap[1];
std::string name = myMap.at(2);
auto it = myMap.find(3);
if (it != myMap.end()) { std::cout second; }
if (myMap.count(4)) { /* 存在 */ }
删除元素
支持按迭代器、键或范围删除:
- erase(key):删除指定键,返回删除元素个数(0 或 1)
- erase(iterator):删除迭代器指向元素
- clear():清空所有元素
myMap.erase(1);
auto it = myMap.find(2);
if (it != myMap.end()) myMap.erase(it);
myMap.clear();
遍历 map
map 中的元素按键升序排列,可通过迭代器或范围 for 遍历:
- 范围 for + 结构化绑定(C++17)
- 传统迭代器
for (const auto& [key, value] : myMap) {
std::cout
}
for (auto it = myMap.begin(); it != myMap.end(); ++it) {
std::cout first second
}
常用属性与操作
查询容器状态和大小:
- size():元素个数
- empty():是否为空
- begin()/end():首尾迭代器
myMap.size();
if (myMap.empty()) { /* 无元素 */ }
用于遍历或算法操作
应用实例:统计单词频次
map 常用于计数类问题,例如统计字符串中每个单词出现次数:
#include iostream>
#include
int main() {
std::string text = "apple banana apple orange banana apple";
std::map<:string int>wordCount;
std::stringstream ss(text);
std::string word;
while (ss >> word) {
++wordCount[word];
}
for (const auto& pair : wordCount) {
std::cout
}
return 0;
}
输出:
apple: 3
banana: 2
orange: 1
基本上就这些。掌握 insert、find、erase 和遍历方法,就能高效使用 map 解决大多数键值映射问题。注意避免滥用下标访问导致意外插入,优先使用 find 或 at 更安全。











