176

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

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

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

4

3 回答 3

287

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

当您遍历 astd::map时,您将遍历所有这些std::pairs。当您取消引用其中一个迭代器时,您将获得std::pair包含键及其关联值的 a。

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

在这里,如果您现在这样做*it,您将获得std::pair地图中第一个元素的 。

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

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

于 2013-03-16T16:04:19.040 回答
22

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

std::pair<>有两个名为firstand的成员second(见这里),具有相当直观的含义。i因此,给定一个特定映射的迭代器,表达式:

i->first

这相当于:

(*i).first

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

i->second

这相当于:

(*i).second

指的是第二个元素pair- 即映射中对应的

于 2013-03-16T16:00:31.123 回答
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;
  }
}
于 2021-04-16T19:19:27.760 回答