You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C++ std::unordered_map中递增默认构造的int是否属于未定义行为?

问题描述

我有一个用于计数的std::unordered_map,例如:

std::unordered_map<std::string, std::size_t> counters_;

请问我在尝试递增计数器前,是否需要手动创建对应的值?如下代码是否属于未定义行为?

std::unordered_map<std::string, std::size_t> counters_;

counters_["non_existing_key"] += 1;
解答
  • 不需要手动提前创建对应键值对,这段代码是完全合法的C++标准写法,不存在未定义行为。
  • 这个写法是C++中使用关联容器做计数的经典惯用写法,核心依赖std::unordered_map的operator[]的特性:
    • 当传入的key不存在于容器中时,operator[]会自动插入一个默认初始化的value,然后返回指向该value的可修改左值引用
    • 你的场景中value类型是std::size_t,属于算术类型,默认初始化的结果就是0,因此+=1操作就是在0的基础上加1,最终对应key的value会被设为1,完全符合计数预期
  • 补充说明:如果你不希望查询不存在的key时自动插入新元素,可以用at()成员方法,它会在key不存在时抛出std::out_of_range异常,不过计数场景下用operator[]的自动插入特性是更简洁的选择。

内容的提问来源于stack exchange,提问作者senloa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:18:05