iterator-> second是什么意思?


157

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

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

但是,这两个成员对应什么,为什么我们必须以as的形式访问映射中存储的值it->second


14
A std::map存储一个和一个map::iterator.second是指
Alok保存

Answers:


247

我确定您知道a可以std::vector<X>存储一堆X对象,对吗?但是,如果您有一个std::map<X, Y>,它实际存储的是一堆std::pair<const X, Y>s。这就是地图的确切含义-它将键和关联的值配对在一起。

遍历一个时std::map,您遍历所有这些std::pair。当取消引用这些迭代器之一时,将获得一个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


4
他们为什么不像编程中的其他所有内容一样只使用[0]和[1](分别表示“第一”和“第二”)?

21
@AdamCross因为operator[]必须返回一个特定的类型,但是firstsecond可以有不同的类型。另一方面,std::tuple具有特殊的帮助器功能,std::get用于按索引访问其元素。
约瑟夫·曼斯菲尔德

16

的类型的元素std::map(这也是通过解引用该地图的一个迭代获得的表达式的类型),其关键是K和值Vstd::pair<const K, V>-的关键是const防止从地图值的内部排序干扰。

std::pair<> 有两个成员名为 first和的second(见此处),具有相当直观的含义。因此,给定迭代器i到某个映射,表达式为:

i->first

等效于:

(*i).first

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

i->second

等效于:

(*i).second

引用-的第二个元素,pair即映射中的相应


5
单词“键”和“值”比“第一”和“第二”更直观,这意味着要排序。
ahoffer '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.