2016-04-26 10 views
1

Sagen wir, wir haben std :: map und wir wollen durchlaufen. Was sind Vorteile/Nachteile (oder was ist der Hauptunterschied) zwischen diesen beiden Iterationen?Iterieren durch STL-Klassen in C++ 11

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

und

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

Der erste Code ist nicht compalible und ich weiß nicht, warum, obwohl in cppreference Syntax wie die erste.

+2

'for (auto & it: m0)' - Obwohl Sie die Variable 'it' benannt haben, handelt es sich nicht um einen Iterator, sondern um eine Referenz auf das Element der Karte. –

+2

Der erste gibt Ihnen keinen Iterator in der Schleife, der Ihnen eine Elementreferenz gibt. Sie können es nicht löschen. – Galik

+3

Was ist falsch mit 'm0.clear();'? –

Antwort

-2

Die Verwendung einer auf Schleife basierenden Schleife wertet die Endbedingung nur einmal aus. Eine klassische Schleife mit Iteratoren wertet sie bei jeder Iteration aus. Eine bereichsbasierte Schleife iteriert immer den gesamten Container. Eine klassische Schleife mit Iteratoren kann nur Teile des Containers durchlaufen. Die Syntax der Bereichsschleife ist knapper und klarer.

Das sind die Hauptunterschiede, wie ich sie sehe.

+0

Auch verwendet man Iteratoren, wo das andere Ihnen das Element direkt gibt. – NathanOliver

+0

Currious bezüglich der Downvote (s). Was genau stimmt nicht mit meiner Antwort? –