iterator->第二个意思是什么?

时间:2013-03-16 15:54:52

标签: c++ stl iterator

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

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

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

3 个答案:

答案 0 :(得分:214)

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

当您迭代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>的{​​{1}},则pp.first个对象,Xp.second个对象。

现在您知道取消引用Y迭代器会为您提供std::map,然后您可以使用std::pairfirst访问其元素。例如,second会为您提供密钥,而(*it).first会为您提供价值。这些相当于(*it).secondit->first

答案 1 :(得分:13)

std::map的元素类型(通过解除引用该映射的迭代器获得的表达式的类型),其键为K且值为Vstd::pair<const K, V> - 密钥为const,以防止您干扰地图值的内部排序。

std::pair<>有两个名为firstsecond的成员(请参阅here),其含义非常直观。因此,给定某个映射的迭代器i,表达式为:

i->first

相当于:

(*i).first

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

i->second

相当于:

(*i).second

pair第二个元素 - 即映射到相应的

答案 2 :(得分:0)

用于地图和无序地图。

map 存储键值对,其中 i->first 是键,i->second 是反映值。

#include<bits/stdc++.h>
#define long long int
using namespace std;
int32_t main(){
  map<int,int> m;
  m.insert({1,2});
  m.insert({2,4});
  for(auto i:m){
      cout<<"key - "<<i.first<<" "<<" Value - "<<i.second<<endl;
  }
}