Noi*_*ich 146 c++ iterator stl
在C++中,a的类型是std::map<>::iterator什么?
我们知道it类型的对象std::map<A,B>::iterator有一个重载operator ->,它返回一个std::pair<A,B>*,并且std::pair<>有一个first和second成员.
但是,这两个成员对应的是什么,为什么我们必须访问存储在地图中的值it->second?
Jos*_*eld 224
我相信你知道std::vector<X>存储了一大堆X物品,对吧?但是,如果你有一个std::map<X, Y>,它实际存储的是一大堆std::pair<const X, Y>s.这正是地图的意义 - 它将键和相关值组合在一起.
当你迭代a时std::map,你会迭代所有这些std::pair.当您取消引用其中一个迭代器时,您将获得一个std::pair包含该键及其关联值的值.
std::map<std::string, int> m = /* fill it */;
auto it = m.begin();
Run Code Online (Sandbox Code Playgroud)
在这里,如果您现在这样做*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.
And*_*owl 14
一个元素的类型std::map(它也是通过解除引用该映射的迭代器获得的表达式的类型),其键K和值V是std::pair<const K, V>- 关键是const防止您干扰映射值的内部排序.
std::pair<>有两个名字first和second(见这里)成员,具有非常直观的含义.因此,给定i某个映射的迭代器,表达式为:
i->first
Run Code Online (Sandbox Code Playgroud)
这相当于:
(*i).first
Run Code Online (Sandbox Code Playgroud)
引用迭代器指向的对象的first(const)元素pair- 即它引用映射中的键.相反,表达式:
i->second
Run Code Online (Sandbox Code Playgroud)
这相当于:
(*i).second
Run Code Online (Sandbox Code Playgroud)
指的是第二个元素pair- 即映射中的相应值.