2016-04-26 9 views
1

std :: mapがあり、繰り返し処理したいとします。この2つの反復の長所/短所(または主な違いは何ですか)は何ですか?C++でSTLクラスを反復する11

map<string,int> m0 { { "name1", 20 }, { "name2", 30 }, { "name3", 40 } }; 
for(auto &it : m0) 
    it = m0 . erase(it); 

for (auto it=m0.begin(); it!=m0.end();) 
    it = m0.erase(it); 

最初のコードはcompalibleではなく、cppreference構文で最初のもののようですが、なぜ私は知りません。

+2

'for(auto&it:m0)' - 変数itに名前を付けても、実際にはイテレータではなく、マップの要素への参照です。 –

+2

最初のものはループ内にイテレータを与えていないので、要素参照があります。それを使用して削除することはできません。 – Galik

+3

'm0.clear();の何が問題なのですか? –

答えて

-2

ループベースの範囲を使用すると、終了条件が1回だけ評価されます。イテレータを使用した古典的なループは、各反復でそれを評価します。 範囲ベースのループは、常にコンテナ全体を反復処理します。イテレータを使用した古典的なループでは、コンテナの一部だけを反復できます。 遠隔ループ構文は、より簡潔で明確です。

これらは私が見ている主な違いです。

+0

また、もう一方は要素を直接与えるイテレータを使用します。 – NathanOliver

+0

downvote(s)に関して有害です。私の答えはどういうところが間違っていますか? –

関連する問題