Foreach和For循环的区别
Difference between Foreach and For Loops?
如果两者都能完成相同的工作,那么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更快
- 如何循环打印顶点结构
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- string1 == string2 和你自己的 for 循环比较有什么区别?
- matlab 和 c++ 中的 while 循环之间的区别
- 这两个 for 循环在 C 中有什么区别
- 在基于范围的 for 循环中,& 和 && 之间有什么区别?
- 这两个 while 循环有什么区别?
- 通过引用将循环计数器或范围声明传递给线程有什么区别
- 这两个循环在C++有什么区别
- BOOST_FOREACH 和 c++11 之间基于范围的循环的区别
- C++ 中循环的 while 和 do while 之间的区别
- 为什么 for 循环中的 "++i" 和 "i++" 之间有什么区别?
- Foreach和For循环的区别
- 字符串复制函数中这两个while循环条件的区别
- 范围为循环常量参考似乎没有区别
- STL 容器基于范围的循环中的迭代器语法有什么区别