绝大多数时候直接用m[key] = val赋值即可;需避免覆盖时改用insert()或emplace()并检查返回值;int作键合法但需校验业务合理性;性能敏感且无需有序时应选unordered_map。

map 声明后直接赋值就对了
绝大多数时候,你不需要“把 int 存入 map”这种抽象操作——map 本来就是存键值对的容器,只要类型匹配,operator[] 或 insert() 就能搞定。
常见错误是试图用 push_back()(那是 vector 的)或者手动 new 节点(C++ 不需要也不该这么干)。
-
std::map<int int> m;</int>声明后,m[123] = 456;立刻插入或覆盖键123对应的值 - 如果只是想插入、不希望覆盖已有键,用
m.insert({123, 456});或m.emplace(123, 456); -
operator[]会默认构造值类型(比如int变成0),如果键不存在;insert/emplace则不会触发默认构造,更安全
键重复时 operator[] 会静默覆盖,别指望它报错
map 的键必须唯一,但 C++ 不会在运行时报错提示你“键已存在”。m[key] = val 这种写法,无论 key 是否已存在,都会把 val 赋给它——旧值被无声替换。
这在调试时容易误判逻辑:你以为是新增,其实只是改了老数据。
立即学习“C++免费学习笔记(深入)”;
- 检查键是否存在,用
m.find(key) != m.end()或m.count(key) > 0 - 想严格避免覆盖,别用
operator[],改用insert()并检查返回值:auto [it, inserted] = m.insert({key, val});,inserted是bool -
emplace()同样返回pair<iterator bool></iterator>,且只构造一次对象,比insert({k,v})更高效
int 作键没问题,但注意负数、零、大数的语义是否合理
int 类型本身完全合法作为 map 键,标准库内置了 std::less<int></int> 比较器。但实际使用中,问题往往出在业务逻辑上。
比如用用户 ID 当键,但 ID 是从 1 开始的正整数,你却意外插入了 0 或负数,后续查找失败却查不出原因。
- 确认输入源是否可控:读文件、网络包、用户输入来的
int,可能含非法值 - 不要依赖
map帮你过滤——它照单全收,只是按大小排序存储 - 如果键有明确取值范围(如 ID ∈ [1, 1000000]),建议在插入前做断言或日志,而不是等下游逻辑崩了才找
性能敏感场景慎用 map,考虑 unordered_map
如果你只关心“有没有这个键”“取它的值”,不依赖键的顺序,std::map 的红黑树结构反而成了累赘:每次插入/查找都是 O(log n),而 std::unordered_map<int int></int> 平均是 O(1)。
很多人图省事默认用 map,结果在循环里反复查几千次,性能差出一截还找不到原因。
-
unordered_map不保证遍历顺序,键无序——如果代码依赖for (auto& p : m)按 key 升序输出,就不能换 - 小数据量(unordered_map 优势明显
- 记得包含头文件:
#include <unordered_map></unordered_map>,不是<map></map>
真正容易被忽略的是:map 和 unordered_map 的迭代器失效规则完全不同,一旦你在循环中边遍历边 erase(),行为差异会直接导致崩溃或漏删——这事跟 int 关系不大,但凡用到容器修改,就得盯紧这点。










