Answers:
我确定您知道a可以std::vector<X>
存储一堆X
对象,对吗?但是,如果您有一个std::map<X, Y>
,它实际存储的是一堆std::pair<const X, Y>
s。这就是地图的确切含义-它将键和关联的值配对在一起。
遍历一个时std::map
,您遍历所有这些std::pair
。当取消引用这些迭代器之一时,将获得一个std::pair
包含密钥及其关联值的。
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
迭代器会给您提供一个std::pair
,然后可以使用first
和来访问其元素second
。例如,(*it).first
将为您提供密钥并(*it).second
为您提供价值。这些等效于it->first
和it->second
。
operator[]
必须返回一个特定的类型,但是first
并second
可以有不同的类型。另一方面,std::tuple
具有特殊的帮助器功能,std::get
用于按索引访问其元素。
的类型的元素std::map
(这也是通过解引用该地图的一个迭代获得的表达式的类型),其关键是K
和值V
是std::pair<const K, V>
-的关键是const
防止从地图值的内部排序干扰。
std::pair<>
有两个成员名为 first
和的second
(见此处),具有相当直观的含义。因此,给定迭代器i
到某个映射,表达式为:
i->first
等效于:
(*i).first
指的是第一个(const
pair
迭代器指向的对象)元素-即,它引用映射中的键。相反,表达式:
i->second
等效于:
(*i).second
引用-的第二个元素,pair
即映射中的相应值。
std::map
存储一个键和一个值。map::iterator.second
是指值。