迭代器-> second 是什么意思?

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

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

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

251173 次浏览

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

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

i->first

相当于:

(*i).first

引用迭代器指向的 pair对象的 第一(const)元素-即它引用映射中的 钥匙。取而代之的是这句话:

i->second

相当于:

(*i).second

指的是 pair第二元素-即地图中相应的 价值

我肯定你知道 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允许您通过两个成员访问它的元素: firstsecond。因此,如果您有一个称为 pstd::pair<X, Y>,那么 p.first是一个 X对象,而 p.second是一个 Y对象。

因此,现在您知道解引用 std::map迭代器会得到一个 std::pair,然后您可以使用 firstsecond访问它的元素。例如,(*it).first将给出键值,(*it).second将给出值。它们相当于 it->firstit->second

用于映射和无序映射。

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;
}
}