Ich möchte ein Element mithilfe der Löschmethode aus einem Vektor löschen. Das Problem hierbei ist jedoch, dass das Element nicht nur einmal im Vektor auftritt. Es kann mehrere Male vorkommen und ich muss alle löschen. Mein Code ist so etwas wie diese:Löschen von Elementen aus einem Vektor
void erase(std::vector<int>& myNumbers_in, int number_in)
{
std::vector<int>::iterator iter = myNumbers_in.begin();
std::vector<int>::iterator endIter = myNumbers_in.end();
for(; iter != endIter; ++iter)
{
if(*iter == number_in)
{
myNumbers_in.erase(iter);
}
}
}
int main(int argc, char* argv[])
{
std::vector<int> myNmbers;
for(int i = 0; i < 2; ++i)
{
myNmbers.push_back(i);
myNmbers.push_back(i);
}
erase(myNmbers, 1);
return 0;
}
Dieser Code offensichtlich abstürzt, weil ich das Ende des Vektors am ändert, während durchlaufen. Was ist der beste Weg, dies zu erreichen? I.e. Gibt es eine Möglichkeit, dies zu tun, ohne mehrmals durch den Vektor zu iterieren oder eine weitere Kopie des Vektors zu erstellen?
'std :: remove()' verschiebt Elemente so, dass die zu entfernenden Elemente überschrieben werden. Der Algorithmus ändert nicht die Größe des Containers, und wenn 'n' Elemente entfernt werden, dann ist es undefiniert was die letzten' n' Elemente sind. – wilhelmtell
Erase-Remove-Idiom ist in Artikel 32 in dem Buch "Effective STL: 50 spezifische Möglichkeiten, um Ihre Verwendung der Standard-Template-Bibliothek zu verbessern" von Scott Meyers beschrieben. –
Wie kann ich dies aktualisieren, um ein benutzerdefiniertes Objekt und nicht ein primitives Objekt zu entfernen? Ich möchte etwas löschen, während ich durch einen Vektor Iteriere. –
Benjin