STL映射是否在插入时初始化基本types?

我有这样一个std::map

 map<wstring,int> Scores; 

它存储玩家的名字和分数。 当有人得分时,我会简单地做:

 Scores[wstrPlayerName]++; 

当映射中没有元素的wstrPlayerNamewstrPlayerName它会创build一个,但是在增量之前是否初始化为零或空值,还是未定义?

我应该testing如果元素每增加一次之前是否存在?

运算符[]如下所示:

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

如果你用一个还没有在地图上的来调用它,它会默认构造一个Value的新实例,把它放到你传入的的map中,然后返回一个引用。 在这种情况下,你有:

 map<wstring,int> Scores; Scores[wstrPlayerName]++; 

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

最后,你的代码在地图中放置一个新的对(wstrPlayerName,0),然后返回一个int的引用,然后你增加它。 所以,如果你想让事情从0开始,那么就不需要testing元素是否存在。

这将默认构build一个新的value实例。 对于整数,默认的结构是0,所以这个按预期工作。

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

但是,如果默认构build的值不适合你呢? 在你的情况下,find元素是否已经存在的最好方法是尝试插入它。 std::mapinsert成员函数返回一个std::pair<iterator, bool> 。 无论插入是成功还是失败,对的第一个元素将指向所需的对象(无论是新对象还是已经存在的对象)。 你可以改变它的价值,只要你认为合适。

谢谢您的帮助。

所以std :: maps将它们的基本types值设置为0。

我只是想知道,因为我认为原始types的东西总是不确定的时候创build。

如果我写这样的东西:

 int i; i++; 

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

检查初始化规则。

请参见4.9.5初始化C ++ Prog Lang或C ++ std书。 根据你的variables是否是本地的,静态的,用户定义的或const默认的初始化可能发生。

在你的情况下,int被称为POD(Plain old Datatype)。 任何自动(在堆/本地variables上创build)PODvariables不是默认初始化的。 因此,对于你“我”以上不会有零值。

在堆中定义时,务必习惯初始化POD。 你甚至可以使用int()来初始化值。