簡體   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