比较不同类型的C++ for循环

Non*_*714 3 c++ iterator for-loop c++11

C++非常灵活,我想更深入地理解for循环操作.我希望能够很好地比较每个实现以及更好/更快/更高效的实现.另外,学习实现for循环的其他方法也是一种好处 - 而不一定是STL中的某些东西.

我正在寻找专家的答案,而不是意见.请注意我对答案的许多限制:答案仅涉及所提到的特定for循环,它们的局限性(可能不直观),STL中没有的具体替代方案以及特定的增强.

这些其他for循环(不是"传统")如何以不同/更好的方式工作?

其他"非传统"for-loops有哪些局限性?

示例1)传统的for循环是:

for(int i=0;i<SIZE;i++){
    //do something for each iteration;
}
Run Code Online (Sandbox Code Playgroud)

例2)现在让我说我有一个得分矢量.

vector<int> scores = {77,91,100,88,85,68,95};

for (auto it = scores.begin(); it != scores.end(); ++it){
    //do something for each iteration;
}
Run Code Online (Sandbox Code Playgroud)

例3)相同的得分矢量,不同的循环.

for (auto& x: scores) //do something for each iteration;
Run Code Online (Sandbox Code Playgroud)

我对示例3特别感兴趣,因为它很简单,我不确定它实际上在做什么,但功能与其他两个相同.

eer*_*ika 7

  1. 您可以访问,i以便确定您是在第一次,最后一次还是其他一次迭代中.不适用于非随机访问容器,因此不能用于必须与向量和列表一样使用的通用代码.支持自c ++标准的第一个版本.

  2. 适用于所有标准迭代器,因此适用于通用代码.没有访问迭代计数器,但数量可以被计算std::distance然而,如果迭代不是随机的访问,那么加起来迭代的复杂性.但是,如果您处于第一次或最后一次迭代中,确定仍然是恒定的时间.支持自c ++标准的第一个版本.

  3. 更好的语法,但在语义上等同于某些形式的2.子范围不能使用:始终从开始到结束(除非你爆发).无法访问迭代计数器.在c ++ 11之前不存在.还存在基于宏的实现,例如BOOST_FOREACH做类似的事情并支持旧标准.

迭代器范围可以与基于范围的for循环一起使用来解决这个问题.它们不是标准库的一部分,但有第三方实现.


TL; DR

  1. 当您需要迭代器计数并且不需要通用代码时很方便.
  2. 对于通用的pre c ++ 11代码.
  3. 由于其简单性,默认情况下是一个不错的选择


Mar*_*ork 5

第3版基本上是说第2版的简便方法.

右边的项目scores必须支持std::begin(scores)std::end(scores)太变成语法相当于:

  for (auto& x: scores)
  {
      // STUFF
  }

  // Is the same as:

  for(auto tmp = std::begin(scores); tmp != std::end(scores); ++tmp)
  {
      auto& x = *tmp;
      // tmp not technically available.
      // STUFF
  }
Run Code Online (Sandbox Code Playgroud)