operator[] 访问不存在的 key 会默认构造 value 并插入,非只读操作;应改用 find() 或 C++20 的 contains() 实现安全查找,at() 则在 key 不存在时抛出异常。
operator[] 不是只读查找,它在 key 不存在时会调用 value_type 的默认构造函数创建新元素并插入 map。这意味着即使你只是想“看看有没有”,也会悄悄修改容器状态。
std::map:访问不存在的 key 会插入一个空字符串 ""
std::map> :插入一个空 std::vector
operator[] 可能引发性能问题或意外初始化需要只读语义时,别碰 operator[]。优先用 find() 判断存在性 + 获取迭代器,或 C++20 起直接用 contains()。
auto it = my_map.find(key); if (it != my_map.end()) { /* 使用 it->second */ }if (my_map.contains(key)) { /* 安全读取 my_map[key] 或用 at() */ }
at() 会抛出 std::out_of_range 异常(不插入),但需自行处理异常或确保 key 存在operator[] 永远不抛异常;at() 在 key 不存在时抛 std::out_of_range。二者都要求 key 存在才能安全读值,但“不存在”的后果完全不同。
my_map[key] → 插入 + 返回引用(无异常)my_map.at(key) → 若 key 不存在,抛 std::out_of_range(不插入)find() 或 contains()
operator[] 内部包含查找 + 可能的插入 + 构造,整个过程不是原子操作。多个线程同时对同一 map 调用 operator[](尤其写场景)会导致未定义行为。
std::shared_mutex 或封装成线程安全 wrapper)operator[] 的语义本身就含写可能实际写代码时,最容易忽略的

my_map[key] 前,先问一句:这个 key 真的一定存在吗?我允许它被悄悄创建吗?