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将一元函数应用于指定范围.所以,有两个基本的区别:
begin()to 的指定范围的代码end().begin()和end()函数应用于未定义迭代器的容器.你无法将它与"广义的每个成语"进行比较,因为没有标准的习语.要进行比较,您必须指出具体实现,并且差异通常隐藏在细节中.
如果有的话,他们两个之间有什么区别?如果新名称没有差异?
事实上,这是旧名: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)
希望有所帮助.