添加到std::map中的元素是否自动初始化?
Are elements added to a std::map automatically initialised?
假设我有一个地图
std::map<int, double> foo;
是我写的行为foo[2] += 3.0;
定义?也就是说,是否有任何隐式添加的地图元素自动初始化(希望是0.0
)在我的情况下?
如果没有,我是不是在引入一大堆未定义的行为?如果是这样,我可以做一些时髦的分配器来强制初始化0.0
吗?
是的,它将被值初始化(在您的情况下为0.0
)。根据cppreference:
返回对映射到等价键的值的引用键,如果该键不存在,则执行插入。
如果执行插入操作,则映射值为value-initialized(为类类型默认构造,否则为零初始化)和返回对它的引用。
N3337 [map.access]/1
Effects:如果map中没有与x
对应的key,则将value_type(x,T())
插入到map中
T()
is value-initialization,这是内置类型导致零初始化的情况。因此,foo[2]
将把零初始化的double
插入到映射中,这样代码就定义良好了。
是的,当在不存在的键上使用operator[]
时,它们会自动初始化值。具体来说,在标准中有§23.4.4.3/1的描述(当谈论operator[]
时):
效果:如果map中没有x对应的键,则将
value_type(x, T())
插入到map中
对于大多数数字类型,包括double
,表达式T()
产生该类型的值初始化元素,因此在您的例子中产生0.0
。
相关文章:
- 是否可以在c++中处理字符串流中的各个元素
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 是否可以使用 new 指定具有宏常量的动态分配数组的元素?
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 如何知道地图中的最后一个元素是否被删除?
- 检查 TinyXML 中的元素是否存在
- 经过最后一个数组元素末尾的指针是否应该等于超过整个数组末尾的指针?
- 是否需要 mutex() 来安全地同时访问具有 2 个线程的数组的不同元素?
- 是否有用于元素部分移位的 simd 指令/内在/内置指令?
- 是否有具有外部元素分配的序列容器(在 STL 中)?
- C++:是否可以编写一个函数,将不同类型的元素附加到变体数组中?
- 数组对象的生存期是否在重用其元素存储时结束?
- 擦除是否删除 stl 无序列图元素使用的堆内存
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- 是否可以使用宏来访问动态数组或向量中的元素或为其赋值
- 如果我在相应 char 数组的声明中为其提供额外的元素,是否会自动设置 NULL?
- 使用 at() 访问 std::map 元素是否比运算符 [] 慢?