在 C++ 中, a 的类型是std::map<>::iterator
什么?
我们知道一个it
类型的对象有一个返回 astd::map<A,B>::iterator
的重载对象,并且该对象有一个and成员。operator ->
std::pair<A,B>*
std::pair<>
first
second
但是,这两个成员对应的是什么,为什么我们必须访问存储在 map 中的值it->second
?
我相信你知道 astd::vector<X>
存储了一大堆X
对象,对吧?但如果你有一个std::map<X, Y>
,它实际上存储的是一大堆std::pair<const X, Y>
s。这正是地图的本质——它将键和相关值配对在一起。
当您遍历 astd::map
时,您将遍历所有这些std::pair
s。当您取消引用其中一个迭代器时,您将获得std::pair
包含键及其关联值的 a。
std::map<std::string, int> m = /* fill it */;
auto it = m.begin();
在这里,如果您现在这样做*it
,您将获得std::pair
地图中第一个元素的 。
现在,该类型std::pair
允许您通过两个成员访问其元素:first
和second
. 所以如果你有一个std::pair<X, Y>
被调用的p
,p.first
是一个X
对象并且p.second
是一个Y
对象。
所以现在您知道取消引用std::map
迭代器会给您一个,然后您可以使用andstd::pair
访问它的元素。例如,会给你钥匙,会给你价值。这些等价于和。first
second
(*it).first
(*it).second
it->first
it->second
an 的元素的类型std::map
(也是通过取消引用该映射的迭代器获得的表达式的类型),其键是K
,值V
是std::pair<const K, V>
- 键是const
为了防止您干扰映射值的内部排序。
std::pair<>
有两个名为first
and的成员second
(见这里),具有相当直观的含义。i
因此,给定一个特定映射的迭代器,表达式:
i->first
这相当于:
(*i).first
引用迭代器指向的对象的第一个( const
) 元素——即它引用映射中的一个键。相反,表达式:pair
i->second
这相当于:
(*i).second
指的是第二个元素pair
- 即映射中对应的值。
#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;
}
}