迭代器>第二个是什么意思?
在C ++中, std::map<>::iterator
的types是什么?
我们知道std::map<A,B>::iterator
types的对象有一个重载operator ->
,它返回一个std::pair<A,B>*
,并且std::pair<>
first
和second
成员。
但是,这两个成员是相对应的,为什么我们必须访问存储在地图中的值呢?
我相信你知道一个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
。
现在,typesstd::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).second
将给你的价值。 这相当于it->first
, it->second
。
std::map
(它也是通过取消引用该映射的迭代器而获得的expression式的types)的types,其键为K
并且值为V
是std::pair<const K, V>
-键是const
可以防止干扰映射值的内部sorting。
std::pair<>
有两个成员命名first
和second
(见这里 ),具有相当直观的含义。 因此,给i
一个迭代器到一个特定的地图,expression式:
i->first
这相当于:
(*i).first
引用迭代器指向的pair
对象的第一个 ( const
)元素 – 即它指向映射中的一个键 。 相反,expression式:
i->second
这相当于:
(*i).second
指对中的第二个元素 – 即映射到地图中的对应值 。