繁体   English   中英

基于范围的循环等效

[英]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循环期望beginend 如果所有节省的都是打字,那么它提供了哪些其他优势,因为它只期望beginend 我很好奇,如果上面引用的答案仍然有重要性,因为该论文是从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-exprend-expr确定如下:

  • 如果_RangeT是一个数组类型,则begin-exprend-expr分别是__range__range + __bound ,其中__bound是数组绑定的。 如果_RangeT是一个未知大小的数组或一个不完整类型的数组,那么程序就会形成错误;

  • 如果_RangeT是类类型,则在类_RangeT的范围内查找unqualified-ids的 beginend ,就像通过类成员访问查找(3.4.5)一样,如果其中任何一个(或两者)找到至少一个声明,则开始-exprend-expr分别是__range.begin()__range.end() ;

  • 否则, begin-exprend-expr分别是begin(__range)end(__range) ,其中beginend用参数依赖查找(3.4.2)查找。 出于此名称查找的目的,名称空间std是关联的名称空间。

[例如:

  int array[5] = { 1, 2, 3, 4, 5 }; for (int& x : array) x *= 2; 

- 末端的例子]

2在for-range-declarationdecl-specifier-seq中,每个decl-specifier应该是一个类型说明符constexpr

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM