在C ++中,std::map<>::iterator
的类型是什么?
我们知道it
类型的对象std::map<A,B>::iterator
有一个重载的operator ->
,它返回std::pair<A,B>*
,而std::pair<>
有一个first
}和second
成员。
但是,这两个成员对应的是什么,为什么我们必须以it->second
的形式访问地图中存储的值?
答案 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
类型可让您通过两个成员first
和second
访问其元素。因此,如果您有一个名为std::pair<X, Y>
的{{1}},则p
是p.first
个对象,X
是p.second
个对象。
现在您知道取消引用Y
迭代器会为您提供std::map
,然后您可以使用std::pair
和first
访问其元素。例如,second
会为您提供密钥,而(*it).first
会为您提供价值。这些相当于(*it).second
和it->first
。
答案 1 :(得分:13)
std::map
的元素类型(通过解除引用该映射的迭代器获得的表达式的类型),其键为K
且值为V
, std::pair<const K, V>
- 密钥为const
,以防止您干扰地图值的内部排序。
std::pair<>
有两个名为first
和second
的成员(请参阅here),其含义非常直观。因此,给定某个映射的迭代器i
,表达式为:
i->first
相当于:
(*i).first
指迭代器指向的const
对象的第一个(pair
)元素 - 即它引用键地图。相反,表达式:
i->second
相当于:
(*i).second
指pair
的第二个元素 - 即映射到相应的值。
答案 2 :(得分:0)
#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;
}
}