【问题标题】:What does iterator->second mean?iterator->second 是什么意思?
【发布时间】:2013-03-05 06:46:12
【问题描述】:

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

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

但是,这两个成员对应的是什么,为什么我们必须访问存储在映射中的值it->second

【问题讨论】:

  • 一个std::map存储一个key和一个valuemap::iterator.second指的是value。跨度>

标签: c++ stl iterator


【解决方案1】:

我确定你知道std::vector<X> 存储了一大堆X 对象,对吧?但是如果你有一个std::map<X, Y>,它实际上存储的是一大堆std::pair<const X, Y>s。这正是地图的本质 - 它将键和关联的值配对在一起。

当您迭代 std::map 时,您正在迭代所有这些 std::pairs。当您取消引用其中一个迭代器时,您会得到一个包含键及其关联值的 std::pair

std::map<std::string, int> m = /* fill it */;
auto it = m.begin();

在这里,如果您现在执行*it,您将获得地图中第一个元素的std::pair

现在std::pair 类型允许您通过两个成员访问其元素:firstsecond。所以如果你有一个名为pstd::pair&lt;X, Y&gt;p.first 是一个X 对象,p.second 是一个Y 对象。

所以现在您知道取消引用std::map 迭代器会给您一个std::pair,然后您可以使用firstsecond 访问它的元素。例如,(*it).first 将为您提供密钥,(*it).second 将为您提供值。这些等价于it-&gt;firstit-&gt;second

【讨论】:

  • 为什么他们不像编程中的其他东西一样只使用 [0] 和 [1](表示“第一”和“第二”)?
  • @AdamCross 因为operator[] 必须返回特定类型,但firstsecond 可以有不同的类型。另一方面,std::tuple 有一个特殊的辅助函数 std::get 用于通过索引访问其元素。
  • 官方文档补充:map,在成员类型下,有value_type,指的是pair,很明显你会看到它的成员变量@ 987654357@ 和 second.
【解决方案2】:

键为K,值为Vstd::map(也是通过取消引用该映射的迭代器获得的表达式的类型)的元素类型为std::pair&lt;const K, V&gt; - 键是const,以防止您干扰地图值的内部排序。

std::pair&lt;&gt;有两个成员firstsecond(见here),含义相当直观。因此,给定一个映射到某个映射的迭代器i,表达式:

i->first

相当于:

(*i).first

指的是迭代器指向的pair 对象的first (const) 元素——即它指的是映射中的key。相反,表达式:

i->second

相当于:

(*i).second

指的是pairsecond 元素——即映射中对应的value

【讨论】:

  • “key”和“value”这两个词比“first”和“second”更直观,这意味着排序。
  • @ahoffer 让它重载:D
【解决方案3】:

用于地图和无序地图。

map 存储键值对,其中 i->first 用于键,i->second 用于反映值。

#include<bits/stdc++.h>
#define long long int
using namespace std;
int32_t main(){
  map<int,int> m;
  m.insert({1,2});
  m.insert({2,4});
  for(auto i:m){
      cout<<"key - "<<i.first<<" "<<" Value - "<<i.second<<endl;
  }
}

【讨论】:

    猜你喜欢
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2017-06-11
    • 2018-03-05
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多