Foreach和For循环的区别

Difference between Foreach and For Loops?

本文关键字:区别 循环 For Foreach      更新时间:2023-10-16

如果两者都能完成相同的工作,那么foreach和for循环之间的真正区别是什么?我正在学习c++,显然它的数组没有foreach循环:(

c++中没有"foreach"语言结构,至少字面上没有。c++ 11引入了一些"answers"foreach循环一样好的东西。

传统的for循环与评估条件和执行重复操作有关。这是一个非常通用的控制结构。它最流行的用途是遍历容器或数组内容,但这只是它所能做的一小部分。

另一方面,"foreach"循环则显式设计为遍历容器元素。

的例子:

int arr[5] = { 1, 3, 5, 2, 4 };
for (int & n : arr) { n *= 2; } // "for-each" loop, new in C++11
for (size_t i = 0; i != 5; ++i) { arr[i] *= 2; } // "classic" for loop

在第二个for中,我们使用传统的for循环来增加辅助变量i,以便访问容器arr。第一个基于范围的循环不公开迭代的任何细节,而只是说"对集合中的每个元素做这个和那个"。

由于传统的for循环是一种非常通用的控制结构,因此它也可以用于不同寻常的方式:

std::vector<std::string> all_lines;
for (std::string line; std::cin >> line; all_lines.push_back(line))
{
  std::cout << "On line " << (all_lines.size() + 1) << " you said: " << line << std::endl;
}

您可以将for(A; B; C)简单地重写为while循环:

{  // scope!
  A;
  while (true && B)
  {
    {  // more scope!
      /* for loop body */
    }
    C;
  }
}

Edit:我可能会忽略提到来自<algorithm>库函数模板 std::for_each,它与lambdas结合使用是一种非常好的自描述方式来迭代任意范围(不仅仅是整个容器)。它从第一天就存在了,但在lambdas之前,使用它是一种令人停止的痛苦。


Update:我想到了一些可能与此相关的东西:"foreach"循环通常假设您没有修改容器。修改容器的一种常见循环类型需要传统的for -循环;例如下面这个典型的erase模式:

for(Container::const_iterator it = v.begin(); it != v.end() /* not hoisted! */; /* no increment */ )
{
  // do something
  if (suitable_condition)
  {
    v.erase(it++);   // or it = v.erase(it), depending on container type
  }
  else
  {
    ++it;
  }
}

foreach一般有1个参数,for有3个参数。foreach可以做的任何事情,for也可以。c++中不存在foreach的部分原因是不能总是从类型推断出迭代的次数。

我相信boost库有一种方法可以让foreach工作,c++ 11有一个基于for的范围:

int my_array[5] = {1, 2, 3, 4, 5};
for (int &x : my_array) {
    x *= 2;
}

c++中有一些类似于for数组的东西,那就是迭代器。这两个循环本质上是相同的,唯一的区别是——对于普通的for循环,您可能需要一个索引,这取决于您正在访问的数据类型,以及您是否需要对索引进行一些计算,并且(可能)会增加偏离1的可能性。而foreach循环只是保证数组中有多少元素就执行多少次,而不会暴露索引(你可以模仿),所以我说过它们本质上是相同的,但它们的使用很大程度上取决于你操作数据的方式。

"For Each"语法用于遍历对象集合,而For循环是在给定范围内执行的循环。c++的STL中确实有for_each,可用于迭代线性对象容器(如vector)。

在其他具有foreach结构的语言中,它们通常方便于不必索引到正在循环的集合中。也就是说,您可以获得集合中的下一个对象,而无需访问(或需要)索引本身。如果你出于某种原因需要索引,你通常需要for循环,尽管在某些语言中你可以在他们的'foreach'中访问计数器。

作为经验测试,FOR比FOREACH更快