2012-04-17 83 views
4

最新的C++ 11规范定义了一种称为“基于范围for循环”的新型for循环。 它的外观和机制看起来与其他语言中的for-each循环几乎完全相同。基于范围的循环与for-each循环有什么不同?

他们两个之间有什么不同?如果没有区别为什么新名字?为了澄清,我没有寻找每个或std :: for_each的“基于范围的”C++和其他语言之间的实现差异。相反,我想知道是否有一些隐藏的价值背后的事实,他们决定调用这个新的C++“功能”(或语法,或习惯用语或任何你想调用它)“基于范围的循环”而不是“为每个循环“几乎任何人似乎都在调用这些东西。

+6

无差异。只是本机C++ foreach – k06a 2012-04-17 11:09:02

+1

由每个,你的意思是std :: for_each? – PlasmaHH 2012-04-17 11:10:02

+0

不同之处取决于你比较的语言,所以我认为你需要更具体一些。 – juanchopanza 2012-04-17 11:12:10

回答

13

语法:

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应用于一元函数到指定的范围内。所以,有两个基本的不同:​​

  • 范围为基础的循环语法是更清洁和更普遍的,但你不能在循环中执行的代码比begin()end()不同的指定范围。
  • 通过定义begin()end()函数,基于范围的for循环可应用于没有定义迭代器的容器。

你不能把它比作“广义的,每个成语”,因为没有标准成语。为了进行比较,你必须指出具体的实施和区别通常隐藏在细节

+0

如果你删除自动代码将更加冗长.. – Naveen 2012-04-17 11:19:06

+0

他不会谈论'std :: for_each'。他正在讨论像其他语言一样使用关键字“foreach”。 – Nawaz 2012-04-17 11:22:42

+2

@Naveen:如果你删除了'auto',它甚至不再是正确的。 'auto'做魔术参考类型演绎,如果没有它,你就无法表达。 – 2012-04-17 11:31:00

6

他们两个之间有什么不同? 如果没有区别为什么新的名字?

实际上,它是旧名:for

如果你的意思是,为什么C++不增加新的名称,如foreach,对语言和其它语言一样都做了,那么你告诉我们为什么添加名称时,旧名工作正常?


从您的评论:

但据我所知,所有其他调用这种类型的语法的 “for-each循环”。这个概念的新名称让我问是否确实比我看到的更多的差异。

好的。这是关于术语:for each-loop基于范围的换行

我认为这是因为C++范围为基础的换循环基本上遍历在由std中定义的范围内所有元素::开始(c)中的std ::(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 

希望有所帮助。

+0

我实际上并没有要求引入一个新的关键字'foreach'或类似的东西。 '(某事:某事)'工作正常。并非所有其他语言都使用“foreach”关键字。但据我所知,所有其他人都称这种类型的语法为“for-each loop”。这个概念的新名称让我问是否确实比我看到的更多的差异。 – charisis 2012-04-17 11:25:15

+0

@ charisis:更新了我的答案。 – Nawaz 2012-04-17 11:35:37

+1

@Nawaz:喜欢你的解释和范例,称它为基于范围的循环 – sri 2012-04-18 09:36:15

-4

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