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