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

Noi*_*ich 146 c++ iterator stl

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

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

但是,这两个成员对应的是什么,为什么我们必须访问存储在地图中的值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允许您通过两个成员访问其元素:firstsecond.所以,如果你有一个std::pair<X, Y>被叫p,p.first是一个X对象而且p.second是一个Y对象.

所以现在你知道解除引用std::map迭代器给你一个std::pair,你可以用first和访问它的元素second.例如,(*it).first会给你钥匙,(*it).second并会给你价值.这些相当于it->firstit->second.

  • @AdamCross因为`operator []`必须返回一个特定的类型,但`first`和`second`可以有不同的类型.另一方面,`std :: tuple`有一个特殊的辅助函数`std :: get`,用于通过索引访问它的元素. (20认同)
  • 为什么他们不像编程中的其他一样只使用[0]和[1](对于"第一"和"第二")? (3认同)

And*_*owl 14

一个元素的类型std::map(它也是通过解除引用该映射的迭代器获得的表达式的类型),其键K和值Vstd::pair<const K, V>- 关键是const防止您干扰映射值的内部排序.

std::pair<>有两个名字firstsecond(见这里)成员,具有非常直观的含义.因此,给定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- 即映射中的相应.

  • 单词“键”和“值”比“第一”和“第二”更直观,这意味着要排序。 (3认同)