[英]Range-based for loop equivalent
所以根据n2243 ,基于范围的for循环等价于:
{
auto && __range = ( expression );
for ( auto __begin = std::Range<_RangeT>::begin(__range),
__end = std::Range<_RangeT>::end(__range);
__begin != __end;
++__begin )
{
for-range-declaration = *__begin;
statement
}
}
然后说2 If the header <iterator_concept> is not included prior to a use of the range-based for statement, the program is ill-formed.
所以我质疑这是最新的。 我也很好奇std::Range
是什么,或者它是纯粹的实现细节。 我能找到的最接近的是n3350 。
这个答案依赖于这些信息并说:
范围尽可能快,因为它缓存结束迭代器[引用],使用预增量并且只解引用迭代器一次。
所以,如果你倾向于写:
for(iterator i = cont.begin(); i != cont.end(); i++) { /**/ }
那么,是的,range-for可能稍快一些,因为它也更容易编写,没有理由不使用它(在适当的时候)。
PS我说它尽可能快,但速度并不快。 如果仔细编写手动循环,则可以获得完全相同的性能。
我很好奇它现在是否真的有所作为。 据我所知,它只是语法糖。 例如,在一个循环中你可以做auto it = s.rbegin(); it != s.rend(); ++it
auto it = s.rbegin(); it != s.rend(); ++it
auto it = s.rbegin(); it != s.rend(); ++it
,它需要返回反向迭代器的样板代码,其中基于范围的for循环期望begin
和end
。 如果所有节省的都是打字,那么它提供了哪些其他优势,因为它只期望begin
和end
? 我很好奇,如果上面引用的答案仍然有重要性,因为该论文是从2007年开始的。
正如@DyP所说,这部分在最终标准中有所改变。 C ++ 11 6.5.4基于范围的for
语句[stmt.ranged]:
1对于基于范围
for
形式的语句for ( for-range-declaration : expression ) statement
让range-init等同于括号括起来的表达式
( expression )
而对于基于范围
for
形式的声明for ( for-range-declaration : braced-init-list ) statement
让range-init等同于braced-init-list 。 在每种情况下,基于范围的
for
语句等同于{ auto && __range = range-init; for ( auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin ) { for-range-declaration = *__begin; statement } }
其中
__range
,__begin
和__end
是仅为exposition定义的变量,_RangeT
是表达式的类型, begin-expr和end-expr确定如下:
如果
_RangeT
是一个数组类型,则begin-expr和end-expr分别是__range
和__range + __bound
,其中__bound
是数组绑定的。 如果_RangeT
是一个未知大小的数组或一个不完整类型的数组,那么程序就会形成错误;如果
_RangeT
是类类型,则在类_RangeT
的范围内查找unqualified-ids的begin
和end
,就像通过类成员访问查找(3.4.5)一样,如果其中任何一个(或两者)找到至少一个声明,则开始-expr和end-expr分别是__range.begin()
和__range.end()
;否则, begin-expr和end-expr分别是
begin(__range)
和end(__range)
,其中begin
和end
用参数依赖查找(3.4.2)查找。 出于此名称查找的目的,名称空间std
是关联的名称空间。[例如:
int array[5] = { 1, 2, 3, 4, 5 }; for (int& x : array) x *= 2;
- 末端的例子]
2在for-range-declaration的decl-specifier-seq中,每个decl-specifier应该是一个类型说明符或
constexpr
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.