迭代器>第二个是什么意思?

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

我们知道std::map<A,B>::iteratortypes的对象有一个重载operator -> ,它返回一个std::pair<A,B>* ,并且std::pair<> firstsecond成员。

但是,这两个成员是相对应的,为什么我们必须访问存储在地图中的值呢?

我相信你知道一个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可以通过两个成员访问它的元素: firstsecond 。 所以如果你有一个std::pair<X, Y>叫做pp.first是一个X对象而p.second是一个Y对象。

所以现在你知道解引用一个std::map迭代器给你一个std::pair ,然后你可以用firstsecond访问它的元素。 例如, (*it).first (*it).second将给你的关键和(*it).second将给你的价值。 这相当于it->firstit->second

std::map (它也是通过取消引用该映射的迭代器而获得的expression式的types)的types,其键为K并且值为Vstd::pair<const K, V> -键是const可以防止干扰映射值的内部sorting。

std::pair<>有两个成员命名firstsecond (见这里 ),具有相当直观的含义。 因此,给i一个迭代器到一个特定的地图,expression式:

 i->first 

这相当于:

 (*i).first 

引用迭代器指向的pair对象的第一个const )元素 – 即它指向映射中的一个 。 相反,expression式:

 i->second 

这相当于:

 (*i).second 

指对中的第二个元素 – 即映射到地图中的对应