Kann ich einen Iterator verwenden, nachdem ein Element aus std wurde gelöscht :: multimap <>? [Duplikat]

StackOverflow https://stackoverflow.com/questions/446205

  •  22-07-2019
  •  | 
  •  

Frage

    

Diese Frage bereits eine Antwort hier:

         

Kann ich eine multimap Iterator verwenden, selbst nach einem Aufruf von Multimap :: erase ()? Zum Beispiel:

Blah::iterator iter;
for ( iter = mm.begin();
      iter != mm.end();
      iter ++ )
{
    if ( iter->second == something )
    {
        mm.erase( iter );
    }
}

Sollte dies erwartet werden um korrekt funktionieren, oder ist der Iterator nach dem Aufruf ungültig zu löschen? Referenz-Sites wie http://www.cplusplus.com/reference/stl/multimap /erase.html zu diesem Thema der Lebensdauern von Iteratoren seltsam ruhig sind, oder die Auswirkungen von konstruktiven / destruktiven Methoden auf Iteratoren.

War es hilfreich?

Lösung

http://www.sgi.com/tech/stl/Multimap.html

Multimap has the important property that inserting a new element
into a multimap does not invalidate iterators that point to existing
elements. Erasing an element from a multimap also does not invalidate
any iterators, except, of course, for iterators that actually point to
the element that is being erased.

So ist es sollte wie folgt aussehen:

Blah::iterator iter;
for ( iter = mm.begin();iter != mm.end();)
{
    if ( iter->second == something )
    {
        mm.erase( iter++ );
        // Use post increment. This increments the iterator but
        // returns a copy of the original iterator to be used by
        // the erase method
    }
    else
    {
        ++iter;   // Use Pre Increment for efficiency.
    }
}

Siehe auch: Was passiert, wenn Sie erase () auf einem Kartenelement aufrufen, während von Iterieren beginnen zu beenden?

und

löschen, aber der Iterator auf das nächste Element nach dem löschen

Andere Tipps

C ++ Standard-23.1.2.8:

  

Die Einsatzteile berührt nicht die Gültigkeit von Iteratoren und Verweise auf den Behälter beeinflussen, und die Lösch Mitglieder werden   entkräften nur Iteratoren und Verweise auf die gelöschten Elemente.

Dies ist eine häufige Anforderung für alle assoziativen Container und std :: multimap ist einer von ihnen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top