最新的C ++ 11规范定义了一种称为“基于范围的循环”的新型for循环。 它的外观和机制似乎与其他语言中的for-each循环非常相似。
如果有的话,他们俩之间有什么区别?如果为什么新名称没有差异?
编辑:为了澄清,我不是在寻找每个或std :: for_each的“基于...的范围”与其他语言之间的实现差异。相反,我想知道是否有一些隐藏的价值背后的事实,他们决定称这个新的c ++“功能”(或语法,或成语或任何你想称之为)“基于范围的循环”而不是“为每个循环“就像其他任何人似乎都在呼唤这些东西。
答案 0 :(得分: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
将一元函数应用于指定范围。所以,有两个基本的区别:
begin()
到end()
的指定范围的代码。begin()
和end()
函数,可以将基于范围的for循环应用于未定义迭代器的容器。你无法将它与“广义的每个成语”进行比较,因为没有标准的习语。要进行比较,您必须指出具体实施,差异通常隐藏在细节中。
答案 1 :(得分:6)
如果有的话,他们俩之间有什么区别? 如果新名称没有差异?
事实上,这是旧名称:for
。
如果你的意思是为什么C ++没有像其他语言那样在语言中添加新名称,例如foreach
,那么你告诉我们为什么在添加新名称的时候旧名称工作正常吗?
来自你的评论:
但据我所知,所有其他人都称这种语法为“for-each loop”。这个概念的新名称让我问是否确实存在比我能看到的更多的差异。
好的。它是关于术语: for-each-loop 与基于范围的for-loop 。
我认为这是因为C ++基于范围的循环基本上迭代由 std :: begin(c)和定义的范围内的所有元素的std ::(c)结束。换句话说,名称基于范围的循环强调了定义范围的begin
和end
迭代器的原理。
为了进一步说明,基于范围的循环仅适用于定义了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
希望有所帮助。
答案 2 :(得分:-4)
这是一个标准的foreach实现 - 只是为了方便而添加了语法糖。