【问题标题】:Should I use for iterators instead of for range based loop, if so, why? [closed]我应该使用迭代器而不是基于范围的循环,如果是,为什么? [关闭]
【发布时间】:2021-12-11 06:55:11
【问题描述】:

什么是最好的、基于范围的 for 循环?

for (auto& i : just_a_vec )

还是for循环的迭代器?

for (std::vector<std::string>::iterator it = just_a_vec.begin(); it < just_a_vec.end(); it++)

【问题讨论】:

  • 这能回答你的问题吗? Why use iterators instead of array indices?
  • @Philipp 基于范围的for 是迭代器之上的语法糖,没有这样的性能警告。
  • 可读性最强、错误最少的内容。
  • 只有在分析表明这是一个重大瓶颈时,才偏离最容易阅读/最难出错的地方。
  • 也看std::for_each()。支持这两个不支持的并行化。

标签: c++ c++11 vector iterator


【解决方案1】:

迭代器早于基于范围的for 循环,因此它们曾经是这两个替代方案中唯一可用的。如今,在处理简单循环时,基于范围的for 已经大部分取代了迭代器。

但是,迭代器也可以在各种其他上下文中使用。例如,您可以使用std::sort(v.begin(), std::next(v.begin(), 5)) 对向量的前五个元素进行排序,而保留其余部分。

回到迭代整个容器:

  • 如果您可以使用基于范围的 for 来完成您想要的,那么它会导致代码更清晰,因此默认情况下它们更可取。

  • 如果您出于某种原因需要迭代器,例如使用需要它们的算法,或者因为您需要在迭代时向前或向后跳转,请改用它们。

另外:在后一种情况下,您可以/应该在声明迭代器时仍然使用auto

for(auto it = just_a_vec.begin(); it < just_a_vec.end(); it++) {
}

编辑: 按要求:这是一个简单但有点做作的示例,其中基于迭代器的循环仍然有用:

// adds all values in the vector, but skips over twos values when encountering a 0
// e.g.: {1,2,0,4,5,2} => 5
int my_weird_accum(const std::vector<int>& data) {
  int result = 0; 
 
  for(auto it = data.begin(); it != data.end(); ++it) {
    auto v = *it;
    result += v;

    if(v == 0) {
      // skip over the next two
      assert(std::distance(it, data.end()) > 2);
      std::advance(it, 2);
    }
  }
  return 0;
}

【讨论】:

  • 哦,好吧,你能给我一些可以使用迭代器的情况吗?
  • @apetrai 我已经用一个例子更新了答案。
【解决方案2】:

个人快速回答:它有点单调,并且基于您使用的 c++ 版本。我通常更喜欢基于范围的,但肯定也有迭代器闪耀的时刻。将两者都添加到您的工具箱中。供进一步阅读。

这里是其他 SO 答案的列表,这些答案更深入地了解了性能和用例。

更多信息。谷歌

范围与迭代器循环 c++

【讨论】:

  • 是的,这很有帮助!我还听说它对无序地图有帮助?或类似的东西。
猜你喜欢
  • 2015-04-30
  • 2020-04-03
  • 2020-12-20
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 2020-04-19
相关资源
最近更新 更多