请考虑以下代码:
map<int,int> m;
for(int i=0;i<10000;++i) m[i]++;
for(int i=0;i<10000;++i) printf("%d",m[i]);
我认为打印出来的值是未定义的,因为原始类型没有默认构造函数,但是每次测试时我都得到10000个。
为什么要初始化?
答案 0 :(得分:13)
当调用operator[]
且缺少密钥时,使用表达式mapped_type()
初始化该值,该表达式是类类型的默认构造函数,而整数类型的初始化为零。
答案 1 :(得分:5)
std::map::operator[]不存在,则会插入新值。如果执行插入,则默认构造函数对类类型初始化映射值,否则为zero-initialized初始化。
答案 2 :(得分:3)
请参阅https://www.sgi.com/tech/stl/stl_map.h
_Tp& operator[](const key_type& __k) {
iterator __i = lower_bound(__k);
// __i->first is greater than or equivalent to __k.
if (__i == end() || key_comp()(__k, (*__i).first))
__i = insert(__i, value_type(__k, _Tp()));
return (*__i).second;
}
在您的示例中,_Tp为int
,int()
为0
#include <iostream>
using namespace std;
int main() {
int x = int();
cout << x << endl;
return 0;
}
另外:
感谢@MSalters,他们告诉我上面的代码是SGI而不是std :: map,但我认为它有点像......
答案 3 :(得分:0)
在C ++ 14标准中,[map.access]
部分的文字是:
T& operator[](const key_type& x);
- 效果:如果地图中没有等效于
醇>x
的键,请将value_type(x, T())
插入地图。
因此,正如Joseph Garvin的回答所述,表达式mapped_type()
的结果是插入的内容。这种初始化称为value-initialization。
对于类类型,值初始化的含义并不像其他答案中提供的那么简单。它取决于类类型具有什么类型的构造函数,以及类是否是聚合,如cppreference链接所解释的。
对于此问题中的int
,值初始化意味着int
设置为0
。