Frage zum erase / remove Idiom
-
Hallo,
in dem Buch "Efficient STL" (von Scott Meyers) habe ich vom "remove erase Idiom" gelesen, wenn man einen Bereich aus einem sequenziellen Container löschen will:vector c; //... c.erase( remove(c.begin(), c.end(), ObjectValue), c.end() );Die Frage, die mir bei diesem Idiom gekommen ist: Warum benutzt man hier erase und nicht resize? Mein Gedankengang war, dass resize ja gerade dafür spezialisiert ist, elemente AM ENDE zu entfernen.
Warum wurde sich hier trotzdem für erase entschieden? Liegt es daran, dass erase vom Namen her aussagekräftiger ist? Oder gibt es andere Gründe, wo ich irgendwelche Eigenschaften von resize übersehe?
-
Ja, resize() gibt es afaik nicht für jeden Container. Außerdem benötigt es die Anzahl der überlebenden Elemente, so daß du umrechnen mußt.
-
50STLTIPPS schrieb:
Mein Gedankengang war, dass resize ja gerade dafür spezialisiert ist, elemente AM ENDE zu entfernen.
Nicht unbedingt. Erase ist eigentlich die weniger spezialisierte Version der beiden Funktionen. Resize ist laut Standard äquivalent zu
void resize ( size_type sz , T c = T ()) { if ( sz > size ()) insert ( end () , sz - size () , c ); else if ( sz < size ()) erase ( begin ()+ sz , end ()); else ; }Das darf ein Container natürlich auch anders implementieren.
Aber der Name dürfte auch eine gewichtige Rolle spielen, schließlich will man löschen und nicht die Größe ändern. Der semantische Unterschied ist gewaltig.