添加到std :: map的元素是否自动初始化?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了添加到std :: map的元素是否自动初始化?相关的知识,希望对你有一定的参考价值。

假设我有一张地图

std::map<int, double> foo;

我写作foo[2] += 3.0;的行为是否定义了?也就是说,在我的情况下,是否有任何隐式添加的地图元素自动初始化(希望是0.0)?

如果没有,我是否引入了卡车装载的未定义行为?如果是这样,我可以用分配器做一些时髦的事情来强制初始化到0.0吗?

答案

是的,它将是value-initialized(在你的情况下为0.0)。据cppreference说:

返回对映射到等效于key的键的值的引用,如果此类键尚不存在则执行插入。

如果执行插入,则映射值是值初始化的(默认为类类型构造,否则为零初始化),并返回对它的引用。

另一答案

N3337 [map.access]/1效果:如果地图中没有等效于x的键,则将value_type(x,T())插入到地图中。

T()是值初始化,这是内置类型导致零初始化的情况。因此,foo[2]会将零初始化的double插入到您的地图中,因此您的代码定义明确。

另一答案

是的,当在非现有密钥上使用operator[]时,它们会自动初始化值。特别是在标准中它描述于§23.4.4.3/ 1(当谈论operator[]时):

效果:如果地图中没有等效于x的键,则将value_type(x, T())插入地图中。

对于大多数数字类型,包括double,表达式T()产生该类型的值初始化元素,因此在您的情况下产生0.0

以上是关于添加到std :: map的元素是否自动初始化?的主要内容,如果未能解决你的问题,请参考以下文章

指向std :: vector和std :: list元素的指针

指向 std::vector 和 std::list 元素的指针

使用 std::map 从数组中删除重复项

为啥移动 std::map 无法将元素从一个地图移动到另一个地图

std::map的insert和下标[]操作区别

std::unordered_map::reserve 是不是保证只要映射中的元素较少就不会发生内存分配?