迭代器->秒是什么意思?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

在C ++中,a的类型是std::map<>::iterator什么?

我们知道一个it类型的对象std::map<A,B>::iterator有一个重载的operator ->返回a std::pair<A,B>*,并且std::pair<>有一个firstsecond成员。

但是,这两个成员对应的是什么?为什么我们必须访问存储在地图中的值it->second

提问于
用户回答回答于

我相信你知道std::vector<X>存储一大堆X对象,对吧?但是如果你有一个std::map<X, Y>,它实际存储的是一大堆std::pair<const X, Y>s。这正是一张地图 - 它将键和相关值组合在一起。

当你遍历一个std::map,你正在迭代所有这些std::pairs。当你取消引用其中一个迭代器时,会得到一个std::pair包含密钥及其关联值的值。

std::map<std::string, int> m = /* fill it */;
auto it = m.begin();

在这里,如果你现在做*it,你会得到std::pair地图中的第一个元素。

现在该类型std::pair可以通过两个成员访问其元素:firstsecond。所以如果你有一个std::pair<X, Y>pp.first是一个X对象,并且p.second是一个Y对象。

所以现在你知道解引用一个std::map迭代器给了你一个std::pair,然后你可以通过first和访问它的元素second。例如,(*it).first会给你钥匙,(*it).second并会给你价值。这些等同于it->firstit->second

用户回答回答于

一个std::map(它也是通过取消引用该映射的迭代器而获得的表达式的类型)的元素类型的关键是K和值Vstd::pair<const K, V>- 关键是const防止您干扰映射值的内部排序。

std::pair<>有两个成员命名firstsecond,具有相当直观的意义。因此,给定一个i映射的迭代器,表达式为:

i->first

这相当于:

(*i).first

引用迭代器指向的对象的第一个const)元素pair- 即它指向映射中的一个。相反,表达式:

i->second

这相当于:

(*i).second

指的是第二个元素pair- 即地图中相应的

扫码关注云+社区