【问题标题】:C++11 new way for Iterating through vectors?C++11 遍历向量的新方法?
【发布时间】:2020-07-02 20:01:41
【问题描述】:

我有一个向量并像这样对其进行迭代:

for (int i=0,num_of_roads=roads.size();i<num_of_roads;++i)
{
    roads[i]//...
}

但我看到一些写:

for (Road road:roads)
{
    road//...
}

有人可以解释一下有什么区别吗?他们会给出相同的结果吗

【问题讨论】:

  • 这是一个描述,解释了这相当于什么旧样式循环:en.cppreference.com/w/cpp/language/range-for
  • @WernerHenze 我不想使用自动,我上面写的这两种情况是一样的吗?
  • 您可能想要使用Road &amp;road(如果您需要修改存储在roads 中的值)或const Road &amp;road(以避免复制)。
  • @1201ProgramAlarm 我认为您的解决方案中的“const Road &road”应该是:“const Road &road:Road”吧?
  • road.speed() 出现什么错误?

标签: c++ class for-loop


【解决方案1】:

第一个是简单的循环,从一开始就在 C/C++ 中。第二个称为 range-for 循环。它可以用作更易读的等价物,相当于传统的 for 循环对一系列值(例如容器中的所有元素)进行操作。

语法:

for(declaration : expression)

for-range 循环的每次迭代都会创建一个局部变量 x 并将其初始化为向量的下一个元素。一旦到达vector.end(),循环就会结束。

range-for 循环的简单语法是 - for (auto road: roads)。但请注意,这将创建元素对象的副本。所以你将无法修改原点向量的元素

在您的情况下,如果您只想在不修改元素的情况下访问方法,您应该使用这种语法 - for (const auto&amp; road : roads)。首先,这将防止复制对象,然后还有助于防止对元素进行任何意外修改。


差异 -

  1. 第一个明显的区别是您可以在简单的 for 循环中访问元素索引。但是,在 range-for 循环中,您将无法访问元素的索引。因此,与正常的 for 循环不同(如 arr[i+1]arr[i-2] 等),您将无法在访问当前元素之前访问元素。

  2. 当您想要遍历整个向量以进行读取时,range-for 可能会更好。 range-for 循环就是这样优化的。他们只计算一次完成条件。 Range-for 仅取消引用迭代器一次以检查结束条件。因此,当您想要迭代整个向量时,标准可以保证实现最佳性能,尤其是为了读取目的。

  3. 在普通的 for 循环中,您将通过索引访问元素本身,但如果您选择使用 range-for 循环作为 -for(auto elem:vec),那么这会创建向量的每个元素的副本。如果向量的元素是复杂对象,这可能会很昂贵。如上所述,我们可以通过使用for(auto&amp; elem:vec) 来防止这种情况发生。

只要您只想迭代向量而不需要索引,就应该使用 range-for 循环。当您只想读取向量元素值并且向量由复杂数据类型组成时,它将特别有用。当您只想读取向量时,可以使用 const 引用。如果要将对象修改为 for(auto&amp; elem:vec) ,则可以使用非常量引用。 (理想情况下,出于性能原因,最好使用引用)

这将有助于提高可读性并帮助您保持代码简单。此外,您也不会看到任何性能下降(在少数情况下会略有提升),因此我们也无需担心。

您可以阅读更多关于它的信息here

【讨论】:

    【解决方案2】:

    这称为基于范围的 for 循环。这里已经讨论过了: Enhanced FOR loops in C++

    区别在于第二个road == the value of roads[i]。 你不能做road = new Road() 但你可以做roads[i] = new Road() 基本上不能修改道路矢量

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 2021-08-26
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多