C++ STL映射是否在插入时初始化基元类型?

C++ STL映射是否在插入时初始化基元类型?,c++,dictionary,stl,initialization,primitive-types,C++,Dictionary,Stl,Initialization,Primitive Types,我有一个像这样的std::map: map<wstring,int> Scores; Value& map<Key, Value>::operator[](const Key& key); 当映射中没有键为wstrPlayerName的元素时,它将创建一个元素,但它是在增量之前初始化为零还是null,还是未定义 我应该在每次递增之前测试元素是否存在吗 我只是想知道,因为我认为原始类型的东西在创建时总是未定义的 如果我写下这样的话: int i; i++

我有一个像这样的
std::map

map<wstring,int> Scores;
Value& map<Key, Value>::operator[](const Key& key);
当映射中没有键为
wstrPlayerName
的元素时,它将创建一个元素,但它是在增量之前初始化为零还是null,还是未定义

我应该在每次递增之前测试元素是否存在吗

我只是想知道,因为我认为原始类型的东西在创建时总是未定义的

如果我写下这样的话:

int i;
i++;

编译器警告我未定义,当我运行程序时,它通常不是零。

这将默认构造一个
值的新实例。对于整数,默认构造为0,因此它可以正常工作。

这将默认构造一个
值的新实例。对于整数,默认构造为0,因此它可以正常工作。

运算符[]如下所示:

map<wstring,int> Scores;
Value& map<Key, Value>::operator[](const Key& key);
值和映射::运算符[](常量键和键);
如果使用映射中尚未出现的键调用它,它将默认构造一个值的新实例,将其放入映射中传递的键下,并返回对它的引用。在这种情况下,您有:

map<wstring,int> Scores;
Scores[wstrPlayerName]++;
map评分;
分数[wstrPlayerName]++;
这里的值是int,int默认构造为0,就像您使用int()初始化它们一样。其他基元类型的初始化方式类似(例如,double()long()bool(),等等)


最后,代码在映射中放入一个新对(wstrPlayerName,0),然后返回对int的引用,然后递增该引用。因此,如果希望从0开始,则无需测试元素是否存在。

运算符[]如下所示:

map<wstring,int> Scores;
Value& map<Key, Value>::operator[](const Key& key);
值和映射::运算符[](常量键和键);
如果使用映射中尚未出现的键调用它,它将默认构造一个值的新实例,将其放入映射中传递的键下,并返回对它的引用。在这种情况下,您有:

map<wstring,int> Scores;
Scores[wstrPlayerName]++;
map评分;
分数[wstrPlayerName]++;
这里的值是int,int默认构造为0,就像您使用int()初始化它们一样。其他基元类型的初始化方式类似(例如,double()long()bool(),等等)


最后,代码在映射中放入一个新对(wstrPlayerName,0),然后返回对int的引用,然后递增该引用。因此,如果希望从0开始,则无需测试元素是否存在。

在递增之前不应测试该项是否存在。正如其他人所说,[]操作符正是您所需要的


但是,如果默认构造的值不适用于您呢?在您的情况下,找到元素是否已经存在的最佳方法是尝试插入它。
std::map
insert
成员函数返回一个
std::pair
。无论插入成功还是失败,该对的第一个元素都将指向所需的对象(新对象或已经存在的对象)。然后,您可以根据需要更改其值。

在递增该项之前,不应测试该项是否存在。正如其他人所说,[]操作符正是您所需要的


但是,如果默认构造的值不适用于您呢?在您的情况下,找到元素是否已经存在的最佳方法是尝试插入它。
std::map
insert
成员函数返回一个
std::pair
。无论插入成功还是失败,该对的第一个元素都将指向所需的对象(新对象或已经存在的对象)。然后,您可以根据需要更改其值。

检查初始化规则

参见4.4.5节的C++初始化程序郎或C++ STD书。根据变量是本地变量、静态变量、用户定义变量还是常量变量,可以进行默认初始化

在您的例子中,int被称为POD(普通的旧数据类型)。任何自动(在堆/局部变量上创建)POD变量都不是默认初始化的。因此,对于你来说,上面的“i”不会有零值


在堆中定义POD时,始终养成初始化POD的习惯。您甚至可以使用int()初始化值。

检查初始化规则

参见4.4.5节的C++初始化程序郎或C++ STD书。根据变量是本地变量、静态变量、用户定义变量还是常量变量,可以进行默认初始化

在您的例子中,int被称为POD(普通的旧数据类型)。任何自动(在堆/局部变量上创建)POD变量都不是默认初始化的。因此,对于你来说,上面的“i”不会有零值


在堆中定义POD时,始终养成初始化POD的习惯。您甚至可以使用int()来初始化值。

您所说的PODs是正确的,但OP询问的是std::map执行的初始化。你的答案不适用,可能会让读者感到困惑,因为它似乎与其他答案相矛盾。好吧,你的答案实际上是对@Calmarius的答案的回应,现在我正在阅读它,它在下面(而不是上面)。这真的应该是一个评论,而不是一个单独的答案。作为对所发布问题的回答,这是完全错误的。你所说的PODs是正确的,但OP询问的是由std::map执行的初始化。你的答案不适用,可能会让读者感到困惑,因为它似乎与其他答案相矛盾。好吧,你的答案实际上是对@Calmarius的答案的回应,现在我正在阅读它,它在下面(而不是上面)。这真的应该是一个评论,而不是一个单独的答案。作为对发布的问题的回答,这是完全错误的。对于整数来说,默认构造并不是一件真正的事情。默认初始化使它们处于未初始化状态