范围-based循环和for-each循环有何不同?

5
最新的C++ 11规范定义了一种称为“基于范围的for循环”的新类型的for循环。它的外观和机制似乎与其他语言中可用的for-each循环非常相似。
如果有什么区别,那么这两者之间有什么区别?如果没有区别,为什么要起一个新名字?
编辑:澄清一下,我不是在寻找C++的“基于范围的for循环”与其他语言的“for each”或std::for_each之间的实现差异。相反,我想知道他们决定将这个新的C++“特性”(或语法或习惯用语或任何你想称呼它的东西)称为“基于范围的for循环”,而不是像其他人一样称其为“for each循环”的隐藏价值是什么。

6
没有区别。只是使用本地的C++ foreach语法。 - k06a
1
你说的“by for each”,是指标准库中的std::for_each吗? - PlasmaHH
差异取决于你要比较的语言,所以我认为你需要更具体地说明。 - juanchopanza
我指的是许多语言本地可用的通用for-each习惯用法。我不是试图讨论两种不同实现之间的差异(我相信那里有微妙的差异),但我想知道范围-based循环中是否存在一些重大的概念差异质量,我可能会错过。 - charisis
请使用以下标准:范围for循环或std::for_each。详情请参考链接:https://dev59.com/XWkw5IYBdhLWcg3wSovA - underscore_d
显示剩余3条评论
3个回答

14

语法:

for ( range_declaration : range_expression) loop_statement  

生成等效代码:

{
    auto && __range = range_expression ; 
    auto __begin = begin_expr(__range); 
    auto __end = end_expr(__range); 
    for (;__begin != __end; ++__begin) { 
        range_declaration = *__begin; 
        loop_statement 
    } 
} 

std::for_each会对指定的范围应用一元函数。因此,它有两个基本区别:

  • 基于范围的for循环语法更加简洁而且更通用,但是你不能对从begin()end()以外的特定范围执行循环内的代码。
  • 可以通过定义begin()end()函数来应用基于范围的for循环到没有定义迭代器的容器中。

你不能将其与“通用的for-each习惯用法”进行比较,因为不存在标准惯用法。要进行比较,必须指出具体的实现方式,而差异通常隐藏在细节中


他不谈论 std::for_each。他在谈论像其他语言一样拥有关键字 foreach - Nawaz
2
@Naveen:如果你去掉了“auto”,它甚至就不正确了。 “auto”执行魔法引用类型推断,你无法在没有它的情况下表达它。 - Kerrek SB
我认为,基于范围的for循环使用的东西实际上就是迭代器。 - Johannes Schaub - litb
在指定范围不是从begin()end()的情况下,您无法执行循环中的代码。这就是为什么std:for_each()将继续存在的原因。并非每个人都会一次处理整个容器,这一点始终如此,只要存在接受迭代器对的函数;我猜想,理想情况下,最终Rangess TS将取代它(因为我认为可以形成表达容器子范围的范围对象,并针对该对象进行range-for循环)。 - underscore_d

6
它们之间有什么区别吗?如果没有区别,那为什么需要新名称呢?
实际上,它是旧名称:for。
如果你想知道为什么C++没有像其他语言一样添加一个新名称(例如foreach)到语言中,那么你可以告诉我们,为什么在旧名称工作正常的情况下要添加一个新名称呢?
关于语法类型的命名,其他人称此类语法为"for-each loop"。这个概念的新名称让我想知道是否确实存在更多我看不到的差异。
好的,这是关于术语的问题:for-each-loop和range-based-for-loop。
我认为这是因为C++ range-based-for-loop基本上迭代std :: begin(c)和std :: end(c)定义的范围内的所有元素。换句话说,range-based-for-loop的名称强调了定义范围的begin和end迭代器的哲学。
进一步解释一下,range-based-for-loop只适用于那些定义了begin()和end()的集合:
std::vector<int> v;
int a[100];
int *p = new int[100];

for(int i : v) {} // works :  begin(v) and end(v) are defined
for(int i : a) {} // works :  begin(a) and end(a) are defined
for(int i : p) {} // does not work :  begin(p) and end(p) are not defined

希望这能帮到您。

1
我并不是在呼吁引入一个新的关键字 foreach 或类似的东西。for (something : somethings) 已经很好用了。并非所有的语言都使用 foreach 关键字。但据我所知,所有其他语言都称这种语法为“for-each 循环”。这个概念的新名称让我想知道是否确实存在比我看到的更多的差异。 - charisis
1
@Nawaz:喜欢你对称之为基于范围的for循环的解释和示例。 - sri
@sri: 哇...你在这里,玩得开心吗? - Nawaz

-3

这是一个标准的foreach实现 - 只是为了方便而添加的语法糖。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接