代码之家  ›  专栏  ›  技术社区  ›  Calmarius

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

  •  43
  • Calmarius  · 技术社区  · 16 年前

    我有一个 std::map 这样地:

    map<wstring,int> Scores;
    

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

    Scores[wstrPlayerName]++;
    

    当地图中没有带键的元素时 wstrPlayerName 它将创建一个,但它在增量之前是否初始化为零或null,还是未定义?

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

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

    如果我写下这样的话:

    int i;
    i++;
    

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

    4 回复  |  直到 7 年前
        1
  •  64
  •   Todd Gamblin    16 年前

    运算符[]如下所示:

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

    如果你用一个 钥匙 这还不在映射中,它将默认构造一个 价值 钥匙

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

    这里的价值是 int int() . 其他基元类型的初始化方式类似( 例如 , 双() , 长() , 等)。

    最后,代码在映射中放入一个新对(wstrPlayerName,0),然后返回对int的引用,然后递增该引用。因此,如果希望从0开始,则无需测试元素是否存在。

        2
  •  12
  •   hazzen    16 年前

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

        3
  •  5
  •   Michael Kristofik    16 年前

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

    但是,如果默认构造的值不适用于您呢?在您的情况下,找到元素是否已经存在的最佳方法是尝试插入它。这个 insert 成员函数 std::map 返回一个 std::pair<iterator, bool>

        4
  •  1
  •   Ketan    16 年前

    检查初始化规则。

    参见4.5.5节的初始化C++ C++郎或C++ STD书。根据变量是本地变量、静态变量、用户定义变量还是常量变量,可以进行默认初始化。

    在您的例子中,int被称为POD(普通的旧数据类型)。任何自动(在堆/局部变量上创建)POD变量都不是默认初始化的。因此,对于你来说,上面的“i”不会有零值。