[英]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-expr
和end-expr
分別為__range
和__range + __bound
,其中__bound
是數組綁定。 如果_RangeT
是未知大小的數組或類型不完整的數組,則程序_RangeT
;- 如果
_RangeT
是類類型,則在類_RangeT
的范圍內查找不合格ID的begin和end,就像通過類成員訪問查找(3.4.5)一樣,並且如果一個(或兩個)都找到至少一個聲明,則beginexpr
和end-expr
分別是__range.begin()
和__range.end()
;- 否則,
begin-expr
和end-expr
分別是begin(__range)
和end(__range)
,其中begin和end是通過與參數相關的查找(3.4.2)查找的。 出於此名稱查找的目的,名稱空間std是關聯的名稱空間。
是的,基於范圍的for
循環使用正向迭代。 如果要向后迭代,則需要自己進行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.