簡體   English   中英

在C ++中使用基於范圍的for循環時,如何告訴它使用哪個迭代器

[英]When using the range based for-loop in c++, how do I tell it which iterator to use

我想知道基於范圍的for循環使用哪種迭代器,例如std :: map; 我假設默認情況下它使用std :: map :: iterator而不是說std​​ :: map :: reverse_iterator。 這是正確的嗎?是否有辦法告訴我實例化我喜歡的迭代器,還是我只需要在此時使用傳統的for循環?

for(const auto&keyValue:myMap)<----是否使用std :: map :: iterator,是否可以使用std :: map :: reverse_iterator

根據C ++標准

—如果_RangeT是類類型,則在_RangeT類的范圍內查找不合格ID的開頭和結尾,就像通過類成員訪問查找(3.4.5)一樣,並且如果一個(或兩個)都找到至少一個聲明, beginexpr和end-expr分別是__range.begin()和__range.end();

因此,在您的情況下,將調用std::map類的成員函數begin()end()

我建議C + =標准委員會介紹一些

for ( auto x : reverse Container ) 

到目前為止,盡管據我所知委員會正在調查這個問題,我仍不知道我的建議的結果。

對於您的情況,您可以對原始標准容器使用一些包裝,該包裝將定義成員函數的開始和結束,並將使用容器的反向迭代器。

本答案所述,有一種反向迭代的方法,但是它使用了boost庫。

for ( const auto & keyValue : myMap )雖然使用普通的std::map::iterator

反向迭代的另一種方法是:

for (std::map::reverse_iterator iterator mymap.rbegin(); iterator != mymap.rend(); ++iterator)

c ++ 98(不僅限於c ++ 11)接受該格式。

簡而言之,基於范圍的for規則如下所示:如果存在,它將調用myMap.begin()myMap.end() 否則,它將調用begin(myMap)end(myMap) 所以是的,在std::map情況下,它使用std::map::iterator

如果要向后迭代,可以自己編寫適配器,也可以使用boost::adaptors::reverse

另請參見: C ++ 11基於反向范圍的for循環

更新:這里是基於全范圍規定for§6.5.4 ),以供參考:

  • 如果_RangeT是數組類型,則begin-exprend-expr分別為__range__range + __bound ,其中__bound是數組綁定。 如果_RangeT是未知大小的數組或類型不完整的數組,則程序_RangeT
  • 如果_RangeT是類類型,則在類_RangeT的范圍內查找不合格ID的begin和end,就像通過類成員訪問查找(3.4.5)一樣,並且如果一個(或兩個)都找到至少一個聲明,則beginexprend-expr分別是__range.begin()__range.end()
  • 否則, begin-exprend-expr分別是begin(__range)end(__range) ,其中begin和end是通過與參數相關的查找(3.4.2)查找的。 出於此名稱查找的目的,名稱空間std是關聯的名稱空間。

是的,基於范圍的for循環使用正向迭代。 如果要向后迭代,則需要自己進行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM