[英]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.