当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《STL映射是否在插入时初始化基元类型?》经验,为你挑选了3个好方法。

std::map喜欢这样的:

map Scores;

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

Scores[wstrPlayerName]++;

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

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

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

如果我写的东西如下:

int i;
i++;

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



1> Todd Gamblin..:

operator []看起来像这样:

Value& map::operator[](const Key& key);

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

map Scores;
Scores[wstrPlayerName]++;

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

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



2> hazzen..:

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



3> Michael Kris..:

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

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

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有