基于循环等效范围
Range-based for loop equivalent
因此,根据n2243,基于循环的范围等效于:
{
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++) { /**/ }
然后,是的,的范围可能会稍微快一点,因为它也更容易写下没有理由不使用它(在适当的时候)。
附言:我说过它尽可能快,但它并不比可能的如果您编写小心地手动循环。
我很好奇它现在是否真的有什么不同。在我看来,这只是句法上的糖。例如,在一个可以执行auto it = s.rbegin(); it != s.rend(); ++it
的循环中,它需要返回反向迭代器的锅炉板代码,其中基于范围的For循环需要begin
和end
。如果它所节省的只是打字,那么它还提供什么其他优势,因为它只期望begin
和end
?我很好奇我上面引用的答案是否仍然有分量,因为这篇论文是2007年的。
正如@DyP所说,这一部分在最终标准中发生了一些变化。C++11 6.5.4基于范围的for
语句[stmt.range]:
1对于形式的基于范围的
for
语句for ( for-range-declaration : expression ) statement
让范围init等价于用括号包围的表达式
( expression )
并且对于形式的基于范围的CCD_ 11语句
for ( for-range-declaration : braced-init-list ) statement
让范围init等价于支持的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
是仅为显示定义的变量,_RangeT
是表达式的类型,开始expr和结束expr确定如下:
如果
_RangeT
是数组类型,则开始expr和结束expr分别为__range
和__range + __bound
,其中__bound
是数组绑定。如果_RangeT
是未知大小的数组或不完整类型的数组,则程序格式错误;如果
_RangeT
是类类型,则在类_RangeT
的作用域中查找非限定idbegin
和end
,就像通过类成员访问查找一样(3.4.5),并且如果其中一个(或两个)找到至少一个声明,则开始expr和结束expr分别为__range.begin()
和__range.end()
;否则,begin expr和end expr分别为
begin(__range)
和end(__range)
,其中begin
和end
是通过参数相关查找(3.4.2)查找的。为了进行此名称查找,命名空间CCD_ 32是相关联的命名空间。[示例:
int array[5] = { 1, 2, 3, 4, 5 }; for (int& x : array) x *= 2;
--结束示例]
2在范围声明的decl说明符seq中,每个decl说明符应为类型说明符或
constexpr
。
- 基于范围循环到旧编译器的旧样式
- 带有自定义对象的C 范围循环
- 为什么编译器不优化集合元素上的空范围循环?
- 迭代在包含向量的vor in for for范围循环中迭代
- 我们可以在范围循环中使用引用(而不是指针)上的删除
- 如何实现我的自定义范围循环
- C++范围循环
- GCC 4.4 不实现 C++11 范围循环.它还支持哪些其他范围循环语法
- 嵌套c++11范围循环,用于查找组合
- 范围循环中的访问索引
- 对于不可复制类型的范围循环,是否可能
- 我的范围循环出现逻辑错误
- 如何在我的类上允许范围循环
- c++的范围循环比递减循环快
- 通过范围循环从指针容器中获取取消引用元素的引用
- c++ 11:为什么这个范围循环会使FPS下降35
- 带有自定义类的范围循环(矢量的简单版本<string>,使用分配器)
- MSVC10 Visual Studio 2010支持c++范围循环吗?
- 围绕 2 的幂范围循环变量
- toupper() 在 for 范围循环中不起作用