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
指的是第一个(constpair迭代器指向的对象)元素-即,它引用映射中的键。相反,表达式:
i->second
等效于:
(*i).second
引用-的第二个元素,pair即映射中的相应值。
std::map存储一个键和一个值。map::iterator.second是指值。