{
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
}
}
它接着说:
如果在使用基于范围的for语句之前未包含头文件<iterator_concept>,则程序将无法形成。
所以我怀疑这个信息是否最新。我也很好奇std::Range
是什么或者它是否纯粹是一个实现细节。我能找到的最接近的是n3350。这个答案依赖于这个信息,并且说:
我很好奇它现在是否真的有所不同。就我所看到的,它只是一种语法糖。例如,在一个循环中,你可以这样做:Range for循环尽可能快,因为它缓存了终止迭代器[citation],使用前置递增并且只引用一次迭代器。
所以如果你经常写:
for(iterator i = cont.begin(); i != cont.end(); i++) { /**/ }
那么,是的,range-for可能会稍微快一点,因为它更容易编写,没有理由不使用它(在适当的情况下)。
P.S. 我说它尽可能快,但它并不比可能更快。如果你仔细编写手动循环,可以实现完全相同的性能。
auto it = s.rbegin(); it != s.rend(); ++it
,但它需要返回反向迭代器的样板代码,而范围-based 的循环则期望 begin
和 end
。如果它只是为了节省打字,那么它还有什么其他优点呢?因为它只期望 begin
和 end
。我很好奇上面引用的答案是否仍然有权威性,因为该论文出自2007年。
std::Range
部分已被替换。 - dyp