我std::map
喜欢这样的:
mapScores;
它存储球员的名字和分数.当有人获得分数时,我会这样做:
Scores[wstrPlayerName]++;
当在用钥匙将地图元素没有wstrPlayerName
它会创建一个,但它的增量前初始化为零或为空,或者它未定义?
我应该每次在增量之前测试元素是否存在吗?
我只是想知道,因为我认为原始类型的东西在创建时总是未定义的.
如果我写的东西如下:
int i; i++;
编译器警告我,我是未定义的,当我运行程序时,它通常不为零.
operator []看起来像这样:
Value& map::operator[](const Key& key);
如果你用一个尚未在地图中的键来调用它,它将默认构造一个新的Value实例,将它放在你传入的键下的地图中,并返回对它的引用.在这种情况下,你有:
mapScores; Scores[wstrPlayerName]++;
这里的值是int,而int是默认构造为0,就好像用int()初始化它们一样.其他原始类型被类似地初始化(例如,double(),long(),bool()等).
最后,您的代码在地图中放置一对新对(wstrPlayerName,0),然后返回对int的引用,然后再将其递增.因此,如果您希望事物从0开始,则无需测试元素是否存在.
这将默认构造一个新的实例value
.对于整数,默认构造为0,因此这可以按预期工作.
在递增之前,您不应测试该项是否存在.正如其他人所说的那样,[]运算符完全按照你的需要去做.
但是如果默认构造的值不适合你呢?在您的情况下,查找元素是否已存在的最佳方法是尝试插入它.返回a 的insert
成员函数.无论插入成功还是失败,该对的第一个元素都将指向所需的对象(您的新对象或已存在的对象).然后,您可以根据需要更改其值.std::map
std::pair