在 C++ 中, a 的类型是std::map<>::iterator什么?
我们知道一个it类型的对象有一个返回 astd::map<A,B>::iterator的重载对象,并且该对象有一个and成员。operator ->std::pair<A,B>*std::pair<>firstsecond
但是,这两个成员对应的是什么,为什么我们必须访问存储在 map 中的值it->second?
我相信你知道 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允许您通过两个成员访问其元素:first和second. 所以如果你有一个std::pair<X, Y>被调用的p,p.first是一个X对象并且p.second是一个Y对象。
所以现在您知道取消引用std::map迭代器会给您一个,然后您可以使用andstd::pair访问它的元素。例如,会给你钥匙,会给你价值。这些等价于和。firstsecond(*it).first(*it).secondit->firstit->second
an 的元素的类型std::map(也是通过取消引用该映射的迭代器获得的表达式的类型),其键是K,值V是std::pair<const K, V>- 键是const为了防止您干扰映射值的内部排序。
std::pair<>有两个名为firstand的成员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;
}
}