迭代器->;第二个意思? 在C++中,A类型的STD是::MAP::迭代器< /C> >?/P>

迭代器->;第二个意思? 在C++中,A类型的STD是::MAP::迭代器< /C> >?/P>,c++,stl,iterator,C++,Stl,Iterator,我们知道,类型为std::map::iterator的对象it有一个重载的操作符->,它返回一个std::pair*,并且std::pair有一个第一个和第二个成员 但是,这两个成员对应什么,为什么我们必须访问存储在映射中的值作为it->second其键为K且值为V为std::pair-键为const,以防止您干扰映射值的内部排序 std::pair有两个成员,分别命名为first和second(请参见),具有相当直观的含义。因此,给定某个映射的迭代器i,表达式: i->first i-

我们知道,类型为
std::map::iterator
的对象
it
有一个重载的
操作符->
,它返回一个
std::pair*
,并且
std::pair
有一个
第一个
第二个
成员


但是,这两个成员对应什么,为什么我们必须访问存储在映射中的值作为
it->second
其键为
K
且值为
V
std::pair
-键为
const
,以防止您干扰映射值的内部排序

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

i->first
i->second
这相当于:

(*i).first
(*i).second
指迭代器指向的
对象的第一个(
const
)元素,即它指映射中的键。相反,表达式:

i->first
i->second
这相当于:

(*i).first
(*i).second

引用
对的第二个元素,即映射中的对应值。

我确信您知道
std::vector
存储了一大堆
X
对象,对吗?但是如果你有一个
std::map
,它实际上存储的是一大堆
std::pair
s。这正是映射的含义——它将键和相关值配对在一起

当您迭代一个
std::map
时,您正在迭代所有这些
std::pair
s。当您取消引用其中一个迭代器时,将得到一个
std::pair
,其中包含键及其关联值

std::map<std::string, int> m = /* fill it */;
auto it = m.begin();
std::map m=/*填充它*/;
自动it=m.begin();
在这里,如果您现在执行
*it
,您将获得映射中第一个元素的
std::pair

现在,该类型允许您通过两个成员访问其元素:
first
second
。因此,如果您有一个名为
p
std::pair
p.first
X
对象,
p.second
Y
对象

现在您知道,取消对
std::map
迭代器的引用会得到一个
std::pair
,然后可以使用
第一个
第二个
访问它的元素。例如,
(*it)。首先
将为您提供密钥,
(*it)。其次
将为您提供值。这相当于用于地图和无序地图的
it->first
it->second

。 map存储键值对,其中i->first表示键,i->second表示反射值。
#包括
#定义长整型
使用名称空间std;
int32_t main(){
地图m;
m、 插入({1,2});
m、 插入({2,4});
用于(自动i:m){

coutA
std::map
存储一个键和一个值。
map::iterator.second
指的是该值。为什么他们不像编程中的其他任何东西一样使用[0]和[1](表示“第一”和“第二”)呢?@AdamCross因为
运算符[]
必须返回特定的类型,但是
第一个
第二个
可以有不同的类型。另一方面,
std::tuple
有一个特殊的帮助函数
std::get
,用于通过索引访问其元素。单词“key”和“value”比“first”和“second”更直观,这意味着排序。