【问题标题】:Difference between auto it = v.begin() and int it=v.begin(), where v is a vector<int>auto it = v.begin() 和 int it=v.begin() 的区别,其中 v 是一个向量<int>
【发布时间】:2020-04-15 03:02:31
【问题描述】:

当我使用int it = v.begin()时,它给了我这个错误:

prog.cpp: In function ‘int findFrequency(std::vector<int>, int)’:
prog.cpp:18:32: error: cannot convert ‘std::vector<int>::iterator {aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >}’ to ‘int’ in initialization
     for(int iterator = v.begin();iterator!=v.end();iterator+

但它与auto it = v.begin() 配合得很好,为什么?

【问题讨论】:

  • auto 将找出需要的类型。当您使用auto 时,它使it 成为std::vector::iteratorstd::vector::begin 返回 std::vector::iterator,而不是 int
  • begin() 返回一个迭代器,而不是一个 int
  • std::vector&lt;int&gt;::begin() 不返回整数类型,因此 int it = v.begin() 不会编译。 auto it = v.begin() 会起作用,因为它会推断返回的类型。
  • 您可能会将v.front()v.begin() 混淆。前者将返回向量的第一个元素,而后者从向量的开头返回一个迭代器
  • @chatterjee7 plz,如果您觉得有答案符合您的问题,请接受。如果没有,请向我们提供有关您误解的更多信息。

标签: c++ vector stl iterator


【解决方案1】:
 int it = v.begin()

是错误的,因为v.begin() 返回的类型是std::vector&lt;int&gt;::iterator 而不是int

同时

  auto it = v.begin()

推导出迭代器的类型

【讨论】:

    【解决方案2】:

    这是因为迭代器不是整数。迭代器是一个指针,它像向量一样指向列表中的元素。

    整数只是一个整数,1、2、3、4...

    您不能将迭代器分配给整数,因为它们不相同。这是一个link,可以让您深入了解迭代器

    auto 将简单地推断类型本身,以便它可以确定.begin() 返回一个迭代器。

    【讨论】:

    • 这个答案几乎和asmmo 的答案一样好,除了一个迭代器是一个指针。这听起来像一个原始指针。这是一个实现细节(在您的平台上可能是真的,并且在我的 AFAIK 上),但您不能依赖它。
    • @Scheff 很公平。虽然从手头的问题来看,不潜入超深感觉是合适的。
    【解决方案3】:

    要记住的两点:

    • v.begin() 是一个迭代器,指向向量 v 中的第一个元素。该迭代器作为整数类型的向量容器,其形式为std::vector&lt;int&gt;::iterator,而不是int
    • auto 关键字自动采用其初始化程序中的数据类型,并将其分配为使用它声明的变量的数据类型。

    可能的更正/替代方案?

    • 如果您希望将 迭代器提取到向量中的第一个元素,则坚持使用 auto 或定义迭代器:
    std::vector<int>::iterator it = v.begin();
    
    • 如果您要提取第一个元素,则使用其数据类型声明它,对于int 类型的向量,它将是int:(您可能已经想到的,并且正如 smac89 所指出的那样)
    int it = v.front();
    

    或者你可以再次使用 auto:

    auto it = v.front();
    

    在这种情况下,自动推导出的it的数据类型将是int,这就是v.front()的类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 2021-02-20
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      相关资源
      最近更新 更多