STL映射是否在插入时初始化基本types?
我有这样一个std::map
:
map<wstring,int> Scores;
它存储玩家的名字和分数。 当有人得分时,我会简单地做:
Scores[wstrPlayerName]++;
当映射中没有元素的wstrPlayerName
键wstrPlayerName
它会创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::map
的insert
成员函数返回一个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()来初始化值。