基于范围的循环如何与for-each循环不同?

cha*_*sis 5 c++ for-loop c++11

最新的C++ 11规范定义了一种称为"基于范围的循环"的新型for循环.它的外观和机制似乎与其他语言中的for-each循环非常相似.

如果有的话,他们两个之间有什么区别?如果新名称没有差异?

编辑:为了澄清,我不是在寻找每个或std :: for_each的"基于c ++的范围"与其他语言之间的实现差异.相反,我想知道是否有一些隐藏的价值背后的事实,他们决定称这个新的c ++"功能"(或语法,或成语或任何你想称之为)"基于范围的循环"而不是"为每个循环"就像其他任何人似乎都在呼唤这些东西.

Raf*_*cki 14

句法:

for ( range_declaration : range_expression) loop_statement  
Run Code Online (Sandbox Code Playgroud)

产生相当于的代码:

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

std::for_each将一元函数应用于指定范围.所以,有两个基本的区别:

  • 基于范围的for循环语法更清晰,更通用,但是您不能在循环中执行不同于begin()to 的指定范围的代码end().
  • 基于范围的for循环可以通过定义begin()end()函数应用于未定义迭代器的容器.

你无法将它与"广义的每个成语"进行比较,因为没有标准的习语.要进行比较,您必须指出具体实现,并且差异通常隐藏在细节中.

  • @Naveen:如果你删除了'auto`,它就不再是正确的了.`auto`做魔术引用类型演绎,没有它你就无法表达. (2认同)

Naw*_*waz 6

如果有的话,他们两个之间有什么区别?如果新名称没有差异?

事实上,这是旧名:for.

如果你的意思是为什么C++没有foreach像其他语言那样添加一个新名称,比如语言,那么你告诉我们为什么在旧名称工作正常时添加名称?


来自你的评论:

但据我所知,所有其他人都称这种语法为"for-each loop".这个概念的新名称让我问我是否确实存在更多的差异.

好的.它是关于术语:for-each-loop基于范围的for-loop.

我认为这是因为基于C++ range-for-loop基本上迭代了std :: begin(c)std :: end(c)定义的范围内的所有元素.换句话说,名称基于范围的循环强调了定义范围的哲学和迭代器.beginend

为了进一步解释,基于范围的循环仅适用于那些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
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.