【问题标题】:why are these two ways of accessing parts of C++ map pairs different为什么这两种访问部分 C++ 映射对的方式不同
【发布时间】:2015-01-07 13:31:55
【问题描述】:

当我收到一个错误提示我使用 . 运算符从映射中访问一对中的值时,我感到很困惑,因为当我在代码中的两个位置更改它时,我收到了一个新错误,提示我使用-> 在代码中的第二位。我听了唠叨的编译器。为什么我需要这样做?

这就是我正在做的事情:

在基于范围的 for 循环中,我想要键值对中的值,例如:

std::map<std::string, aclass> mapthings;
...
for (auto& it : mapthings) {
    fout << it.second.stringify();
}

我也在使用相同的mapthings,但使用的是find() 函数:

return (mapthings.find(name))->second;

【问题讨论】:

  • OT,但如果name 未找到,(mapthings.find(name))-&gt;second; 将导致未定义的行为;所以那段代码可能需要重写
  • 感谢您的提醒。

标签: c++ for-loop map stdmap std-pair


【解决方案1】:

因为 find 返回 mapthings::iterator,它存储了一个指向 mapthings::value_type 的指针。 而 auto& 它是 mapthings::value_type 的对象。

【讨论】:

    【解决方案2】:

    在第一个示例中,基于范围的 for 循环直接给出对象。所以你可以使用.。 在第二个示例中,find 为您提供了对象的迭代器。这迫使您使用-&gt;,因为您需要对象本身。

    【讨论】:

      【解决方案3】:

      在这段代码中sn-p

      std::map<std::string, aclass> mapthings;
      ...
      for (auto& it : mapthings) {
          fout << it.second.stringify();
      }
      

      itstd::map&lt;std::string, aclass&gt; 的 value_type 类型,对应于类型

      std::pair<const std::string, aclass>
      

      所以要访问这种类型的对象的成员,你必须使用操作符。

      在这段代码中sn-p

      return (mapthings.find(name))->second;
      

      方法find 返回指向映射的目标记录或end() 返回的迭代器的迭代器。迭代器就像指针。所以你需要使用 operator -> 来访问指向对象的成员。

      考虑到你可以写得更简单

      return mapthings.find( name )->second;
      

      return ( *mapthings.find( name ) ).second;
      

      【讨论】:

      • 感谢您在回答末尾的建议。
      • @joseph644 没问题。:)
      【解决方案4】:

      当您使用此代码时,您会获得对包含您的数据的 std::pair 的引用

      for (auto& it : mapthings) {
          fout << it.second.stringify();
      }
      

      在第二个例子中,find 返回一个迭代器,需要解除引用才能读取

      【讨论】:

        【解决方案5】:

        在第一个中,您会得到一个std::map::value_type&amp;,它被定义为std::pair&lt;const Key, T&gt;。这种方法最适合访问地图的所有成员。

        在第二个中,您会得到一个std::map::iteratorstd::map::iteratoroperator-&gt; 重载,它返回一个 std::map::value_type*。此方法最适合findupper_boundlower_bound 等,因为您是在地图上执行查询。该地图可能不包含与查询中使用的key 对应的成员。

        【讨论】:

          猜你喜欢
          • 2020-07-27
          • 1970-01-01
          • 2010-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-03
          • 1970-01-01
          • 2019-11-08
          相关资源
          最近更新 更多