【问题标题】:Do STL maps initialize primitive types on insert?STL 映射是否在插入时初始化原始类型?
【发布时间】:2010-10-05 05:04:20
【问题描述】:

我有一个这样的std::map

map<wstring,int> Scores;

它存储玩家的姓名和分数。当有人得分时,我会这样做:

Scores[wstrPlayerName]++;

当映射中没有键为wstrPlayerName 的元素时,它将创建一个,但它是在增量之前初始化为零还是为空,还是未定义?

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

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

如果我这样写:

int i;
i++;

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

【问题讨论】:

    标签: c++ dictionary stl initialization primitive-types


    【解决方案1】:

    operator[] 看起来像这样:

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

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

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

    这里的值是 int,int 默认构造为 0,就好像你用 int() 初始化它们一样。其他基本类型的初始化类似(egdouble()long()bool() 等.).

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 对于整数,默认的 construction 并不是真正的东西。默认 initialization 使它们保持未初始化,除非它们是静态的。映射 value-initialize 元素,这就是为什么在整数的情况下你会得到零初始化。
      【解决方案3】:

      您不应该在增加它之前测试该项目是否存在。正如其他人所说,[] 运算符完全符合您的需要。

      但是,如果默认构造的值对您不起作用怎么办?在您的情况下,查找元素是否已存在的最佳方法是尝试插入它。 std::mapinsert 成员函数返回 std::pair&lt;iterator, bool&gt;。无论插入成功还是失败,该对的第一个元素都将指向所需的对象(您的新对象或已经存在的对象)。然后,您可以根据需要更改其值。

      【讨论】:

        【解决方案4】:

        检查初始化规则。

        请参阅第 4.9.5 节 C++ Prog Lang 或 C++ 标准书的初始化。取决于您的变量是本地的、静态的、用户定义的还是 const 默认初始化。

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

        始终养成在堆中定义时初始化 POD 的习惯。你甚至可以使用 int() 来初始化值。

        【讨论】:

        • 您所说的关于 POD 的内容是正确的,但 OP 询问的是 std::map 执行的初始化。您的答案不适用,并且可能会使读者感到困惑,因为它似乎与其他答案相矛盾。
        • 好吧,您的回答实际上是对@Calmarius 的回答的回应,正如我现在正在阅读的那样,它现在是 below(而不是 above)。这真的应该是一个评论,而不是一个单独的答案。
        • 作为对已发布问题的回答,这是完全错误的。
        猜你喜欢
        • 1970-01-01
        • 2021-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-28
        • 2014-01-09
        • 2021-12-31
        • 1970-01-01
        相关资源
        最近更新 更多