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

Cal*_*ius 43 c++ dictionary stl initialization primitive-types

std::map喜欢这样的:

map<wstring,int> Scores;
Run Code Online (Sandbox Code Playgroud)

它存储球员的名字和分数.当有人获得分数时,我会这样做:

Scores[wstrPlayerName]++;
Run Code Online (Sandbox Code Playgroud)

当在用钥匙将地图元素没有wstrPlayerName它会创建一个,但它的增量前初始化为零或为空,或者它未定义?

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

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

如果我写的东西如下:

int i;
i++;
Run Code Online (Sandbox Code Playgroud)

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

Tod*_*lin 62

operator []看起来像这样:

Value& map<Key, Value>::operator[](const Key& key);
Run Code Online (Sandbox Code Playgroud)

如果你用一个尚未在地图中的来调用它,它将默认构造一个新的Value实例,将它放在你传入的下的地图中,并返回对它的引用.在这种情况下,你有:

map<wstring,int> Scores;
Scores[wstrPlayerName]++;
Run Code Online (Sandbox Code Playgroud)

这里的值是int,而int是默认构造为0,就好像用int()初始化它们一样.其他原始类型被类似地初始化(例如,double(),long(),bool()等).

最后,您的代码在地图中放置一对新对(wstrPlayerName,0),然后返回对int的引用,然后再将其递增.因此,如果您希望事物从0开始,则无需测试元素是否存在.


haz*_*zen 11

这将默认构造一个新的实例value.对于整数,默认构造为0,因此这可以按预期工作.


Mic*_*fik 5

在递增之前,您不应测试该项是否存在.正如其他人所说的那样,[]运算符完全按照你的需要去做.

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