【问题标题】:What is the difference between for each ( in ) and for ( : )?for each ( in ) 和 for ( : ) 有什么区别?
【发布时间】:2014-04-03 11:30:30
【问题描述】:

作为一个有python背景的人,当我第一次看到for ( : )循环时,我很惊讶:

vector<int> vec = {1,2,3,4};
int sum = 0;
for (int i : vec){
    sum += i;
}
//sum is now 10

这是一个非常有用的构造,当您不需要多次索引某个值时可能应该使用它。

但今天我发现还有一个for each ( in )循环,这样使用:

vector<int> vec = {1,2,3,4};
int sum = 0;
for each (int i in vec){
    sum += i;
}
//sum is now 10

有趣的是,第二个的谷歌搜索结果大多与微软有关,而不是通常的 c++ 参考网站。

这两个循环有什么区别?

【问题讨论】:

  • 第一个是标准 c++(准确地说是 c++11),第二个可能是用宏完成的,或者是编译器特定的而不是标准的。
  • 第二个是 C++/CLI 或 C++/CX 语法,用于迭代实现 IEnumerable 接口的对象。第一个是 C++ 11 迭代器的常规语法。
  • @Stefan 我们可以排除宏选项,它们在 VS2013 中以紫色突出显示。它看起来像一个常规关键字。但是是的,它似乎是非 c++11 的。

标签: c++ loops for-loop


【解决方案1】:

第一个称为range-based for loop,是该语言的 C++11 特性。它允许您在具有 begin() 和 end() 方法可用(成员或非成员)或数组的范围上进行迭代。

第二个是 Microsoft 特定的语法,可用于 C++/CLI,但也可用于 C++。它允许遍历数组或集合。不推荐使用它,应该首选基于范围的 for 循环。见for each, in

【讨论】:

  • 微软喜欢在 C++ 中引入一些东西,然后似乎不推荐使用它;)感谢您的解释!
  • 自 VS2005 起,VC++ 中就提供了这一功能,比 C++11 完成早了 6 年,C++11 引入了基于范围的 for 循环。
【解决方案2】:

for each 循环由 Microsoft Visual C++ 提供。 见:http://msdn.microsoft.com/en-us/library/xey702bw%28VS.80%29.aspx

它不是标准的 C++ 并且相当古老(在 VS2005 中引入)。编译器 (VS) 在编译时将此循环转换为适当的 for 循环。

因此最好坚持使用常规的for ( ; ; ) 循环或for ( : ) 循环以允许与其他编译器(例如 g++)兼容。

【讨论】:

  • 那么我理解他们在 C++11 最终确定之前引入了for each 是否正确?
  • C++11 于 2011 年“最终确定”,所以是的,比那更早。
猜你喜欢
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 2019-10-01
相关资源
最近更新 更多