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的答案的回应,现在我正在阅读它,它在下面(而不是上面)。这真的应该是一个评论,而不是一个单独的答案。作为对发布的问题的回答,这是完全错误的。对于整数来说,默认构造并不是一件真正的事情。默认初始化使它们处于未初始化状态