Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于范围的循环与针对每个循环的循环有何不同? 最新的C++ 11规范定义了一种新的for循环,称为“基于范围的循环”。 它的外观和机制似乎与其他语言中的for-each循环几乎相同_C++_For Loop_C++11 - Fatal编程技术网

基于范围的循环与针对每个循环的循环有何不同? 最新的C++ 11规范定义了一种新的for循环,称为“基于范围的循环”。 它的外观和机制似乎与其他语言中的for-each循环几乎相同

基于范围的循环与针对每个循环的循环有何不同? 最新的C++ 11规范定义了一种新的for循环,称为“基于范围的循环”。 它的外观和机制似乎与其他语言中的for-each循环几乎相同,c++,for-loop,c++11,C++,For Loop,C++11,如果有的话,两者之间有什么区别?如果没有差异,为什么要使用新名称 < > >编辑:,以澄清,我不是在为每个或STD:“C++的范围”和“其他语言”之间寻找实现差异:相反,我想知道,在这一事实背后是否有一些隐藏的价值,他们决定调用这个新的C++“特征”(或语法,或成语或任何你想称之为“基于循环的范围”),而不是“每个循环”,几乎所有其他人都在调用这些东西。 语法: for ( range_declaration : range_expression) loop_statement 生成相当

如果有的话,两者之间有什么区别?如果没有差异,为什么要使用新名称

< > >编辑:,以澄清,我不是在为每个或STD:“C++的范围”和“其他语言”之间寻找实现差异:相反,我想知道,在这一事实背后是否有一些隐藏的价值,他们决定调用这个新的C++“特征”(或语法,或成语或任何你想称之为“基于循环的范围”),而不是“每个循环”,几乎所有其他人都在调用这些东西。

语法:

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循环可以应用于没有定义迭代器的容器
您无法将其与“每个习语的通用性”进行比较,因为没有标准的习语。要进行比较,您必须指出具体的实现,而差异通常隐藏在细节中

如果有的话,两者之间有什么区别如果没有差异,为什么要使用新名称?

事实上,这是一个古老的名字:
代表

如果你说为什么C++没有像其他语言那样添加一个新的名字,比如<代码> Frace>代码>,那么你告诉我们为什么旧名字工作得好时加上一个新的名字?


根据您的评论:

但据我所知,所有其他人都将这种语法称为“for each循环”。这个概念的新名字让我问,是否真的有比我所能看到的更多的差异

好的。它是关于术语的:每个循环与基于范围的循环

我认为这是因为基于C++的for循环基本上迭代了STD::Cad(c)和STD::Enter(C)定义的范围内的所有元素。换句话说,基于名称范围的for循环强调了定义范围的

begin
end
迭代器的原理

为了进一步解释,基于范围的for循环仅适用于定义了
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
std::vector v;
INTA[100];
int*p=新的int[100];
对于(inti:v){}//定义了开始(v)和结束(v)
对于(inti:a){}//定义了works:begin(a)和end(a)
for(int i:p){}//不起作用:未定义开始(p)和结束(p)

希望帮助。

< P>这是一个标准的实现,只是为了方便而添加了语法糖。

没有差异。只是本地C++对每个用户来说,你是指STD::FoY:每个?差异取决于你所用的语言,所以我认为你需要更具体一些。我的意思是,在许多语言中,每种习语的通用性都可以在本地使用。我不想讨论两个不同实现之间的差异(我确信存在细微的差异),但我想知道基于范围的循环中是否存在我遗漏的一些重大概念性差异。这不是一个新名称,因为
for
始终是一个保留关键字;它只是添加了一个新的明确的语法变体
foreach
作为一个关键词会破坏现有的代码,它会剥夺一些基于范围的报价的简洁性,不会有任何好处。他不会谈论
std::for_each
。他说的是像其他语言一样,为每种语言设置一个关键字。@Naveen:如果你删除了
auto
,它就不再正确了
auto
进行了神奇的引用类型推断,如果没有它,您无法表达。hm我想说的是,基于范围的for循环使用的是一个迭代器。+1表示“您不能在指定范围内执行循环中的代码,而不是从
begin()
end()
”。这就是为什么
std:for_each()
将继续存在的原因。并不是每个人每次都使用整个容器。只要存在采用成对迭代器的函数,这是正确的;我想,理想情况下,Ranges TS最终会取代它(因为我假设可以形成一个range对象来表示容器的子范围,range-
表示该容器的子范围)<代码>用于(某物:某物)
工作正常。并非所有其他语言都使用
foreach
关键字。但据我所知,所有其他人都将这种语法称为“for each循环”。这个概念的新名称让我问,是否真的有比我所能看到的更多的差异。@charisis:更新了我的答案。@Nawaz:喜欢你的解释&比如说它是基于范围的-loop@sri:哇。。。你在这里,享受吗?