【发布时间】:2014-01-12 12:42:14
【问题描述】:
所以根据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。
这个answer 依赖此信息并说:
Range for 尽可能快,因为它缓存了结尾 iterator[citation],使用预增量并且只取消引用 迭代一次。
所以如果你倾向于写作:
for(iterator i = cont.begin(); i != cont.end(); i++) { /**/ }那么,是的,range-for 可能会稍微快一些,因为它也更容易 写下没有理由不使用它(在适当的时候)。
附:我说它尽可能快,但它并不比 可能的。如果你写你的,你可以达到完全相同的性能 仔细手动循环。
我很好奇它现在是否真的有所作为。据我所知,它只是语法糖。例如,在可以执行auto it = s.rbegin(); it != s.rend(); ++it 的循环中,它需要返回反向迭代器的样板代码,其中基于范围的for 循环需要begin 和end。如果它节省的只是打字,那么它还提供什么其他优势,因为它只需要begin 和end?我很好奇我上面引用的答案是否仍然有效,因为这篇论文是 2007 年的。
【问题讨论】: