【问题标题】:C++ map over an iterator?C ++映射迭代器?
【发布时间】:2011-07-31 02:28:23
【问题描述】:

我正在查看一些看起来像这样的代码

map<string, int>::iterator itr = mValue.find(inName);

他们为什么要定义一个迭代器。是不是不能说类似

int value = mValue.find(inName)

谢谢。

【问题讨论】:

    标签: c++ map iterator


    【解决方案1】:

    您可以通过取消引用迭代器来获取值(就好像它是一个指针一样)。这将返回一个键/值对类型,它有一个成员 second,它的值是:

    map<string, int>::iterator itr = mValue.find(inName);
    int value = itr->second;
    

    返回迭代器的原因是因为找不到匹配时返回了end()迭代器:

    map<string, int>::iterator itr = mValue.find(inName);
    if (itr == mValue.end())
    {
      throw "No value could be found.";
    }
    
    int value = itr->second;
    

    希望这有点道理。

    【讨论】:

      【解决方案2】:

      如果地图中不存在该键会怎样?你会为find返回什么?使用迭代器,您可以返回mValue.end()。此外,迭代器允许迭代 - int 不允许。

      【讨论】:

        【解决方案3】:

        mValue.find(inName) 将迭代器返回到映射中键 inName 所在的位置。如果只想要对应的值,可以使用mValue[inName]

        【讨论】:

        • 这是非常量的,但如果它不存在,它将创建一个映射条目。 (并不是说如果没有价值,原始代码的灾难性较小)。
        【解决方案4】:
        int value = mValue.find(inName)->second;
        

        如果 find 没有返回 mValue.end()

        【讨论】:

          【解决方案5】:

          你可能想要使用

          map<string, int>::iterator itr = mValue.find(inName);
          int value = mValue[inName];
          
          mValue[inName] = 1234;
          

          小心,它在 const 映射上不起作用(因为它无法插入条目)

          【讨论】:

            【解决方案6】:

            他们为什么要定义一个迭代器。

            因为这是 map .find() 函数返回的内容,所以它包含一个迭代器 关键和价值。或者如果未找到该值,则返回 mValue.end(),即 很有用,因为您可以测试该值是否在地图中找到。

            得到你可以做的价值:

            map<string, int>::iterator itr = mValue.find(inName);
            if(itr != map.end()) {
              int value = itr->second;
              // use value
            }
            

            难道不能说 int value = mValue.find(inName)

            不,std::map 没有这样的功能。 (如果确实如此,则在未找到该值的情况下必须抛出异常)

            【讨论】:

            • 它确实有一个类似的功能 (operator[]),但是如果它不存在的话,它会产生额外的副作用,即在映射中插入键(这样就不得不抛出一个例外)。
            【解决方案7】:

            原文:

            因为 find 会返回该对在映射中找到键的位置。如果未找到,则返回 NULL 并因此检查

            编辑:更新答案,但不删除原始内容,让其他人知道问题出在哪里以及为什么这个答案被否决。

            更新答案:

            因为 find 会返回该对在映射中找到键的位置。如果找不到,则返回 map.end()。

            【讨论】:

            • 找不到时不会返回NULL。所以 -1 表示错误答案。
            • 在最初的否决后未删除答案而获得第二名。
            • @phooji:不可能每个人都一直在线。如果您仅仅因为该人没有删除答案而觉得您想投反对票,您可以这样做。
            • @Sjoerd:我想我错过了这部分......我已经多次使用了表达式 iter == map.end() 。无论如何,感谢您指出这一点。
            猜你喜欢
            • 2021-04-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-02
            • 2023-03-31
            • 2010-11-29
            相关资源
            最近更新 更多