在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不存在于容器中时,
- 补充说明:如果你不希望查询不存在的key时自动插入新元素,可以用
at()成员方法,它会在key不存在时抛出std::out_of_range异常,不过计数场景下用operator[]的自动插入特性是更简洁的选择。
内容的提问来源于stack exchange,提问作者senloa
相关产品推荐
相关产品推荐

