Wenn Sie zum Beispiel eine std::vector<MyClass>
haben, wobei MyClass
eine öffentliche Methode hat: bool isTiredOfLife()
, wie entfernen Sie die Elemente, die wahr zurückgeben?Wie würden Sie Elemente eines std :: vector basierend auf einer Eigenschaft der Elemente entfernen?
Wie würden Sie Elemente eines std :: vector basierend auf einer Eigenschaft der Elemente entfernen?
Antwort
Ich ziehe remove_if
v.erase(remove_if(v.begin(), v.end(),
mem_fun_ref(&MyClass::isTiredOfLife)),
v.end());
remove_if
einen Iterator zeigt nach dem letzten Element zurückgibt, die noch in der Sequenz ist. erase
löscht alles vom ersten bis zum letzten Argument (beide Iteratoren).
Verwenden Sie remove_if ist die "richtige" Möglichkeit, dies zu tun. Achten Sie darauf, KEINEN Iterator zum Durchlaufen und Löschen zu verwenden, da das Entfernen von Elementen den Iterator ungültig macht. In der Tat ist jedes Beispiel, das lies() als primäre Methode verwendet, eine schlechte Idee auf Vektoren, weil das Löschen O (n) ist, was Ihren Algorithmus zu O (n^2) macht. Dies sollte ein O (n) -Algorithmus sein.
Die Methode, die ich unten gebe, ist wahrscheinlich schneller als remove_if, behält aber im Gegensatz zu remove_if NICHT die relative Reihenfolge der Elemente bei. Wenn Sie die Reihenfolge beibehalten möchten (d. H. Ihr Vektor ist sortiert), verwenden Sie remove_if, wie in der obigen Antwort. Wenn Sie nicht über Auftrag ist es egal, und wenn die Anzahl der Elemente als ein Viertel des Vektors gelöscht ist in der Regel weniger werden, ist diese Methode wahrscheinlich schneller sein:
for(size_t i = 0; i < vec.size();)
if(vec[i].isTiredOfLife())
{
vec[i] = vec.back();
vec.pop_back();
}
else
++i;
D'oh. Ich habe das vergessen. Es ist sogar fett in der Seite, die ich verlinkt habe. : o Ich habe meinen Beitrag gelöscht, sodass niemand ihn nutzt. – Bernard
Werden die Elemente im Vektor nicht neu angeordnet? Unter der Annahme, dass zum Beispiel der Eingabevektor sortiert ist, wird der Ausgabevektor nicht, das letzte Element wird die Position des ersten gelöschten Elements einnehmen. –
Vielleicht möchten Sie Ihre Antwort aktualisieren, um nicht mehr auf Bernard zu verweisen. –
- 1. Sind std :: vector Elemente garantiert zusammenhängend?
- 2. Speichern vieler Elemente in std :: vector C++
- 3. Wie oft sollte std :: vector :: resize standardmäßig neue Elemente konstruieren?
- 4. Kopiere Elemente von std :: vector in std :: stack C++
- 5. Hat std :: vector einen Konstruktor {Anfangszahl der Elemente}?
- 6. Entfernen eines ArrayList-Elemente
- 7. Entfernen Sie Elemente in verschachtelten JSON basierend auf Bedingung
- 8. List.Contains basierend auf einer Eigenschaft eines Listenelements
- 9. R: Entfernen der letzten Elemente eines Vektors
- 10. Wie wählen Sie Elemente basierend auf ihrem Stil aus?
- 11. Zeiger auf Elemente von Std :: Vektor und Std :: Liste
- 12. Erstellen Sie eine feste Größe std :: vector und schreiben Sie auf die Elemente
- 13. Sind std :: vector Elemente im physischen Speicher zusammenhängend?
- 14. Elemente einer Liste entfernen explizit
- 15. So entfernen Sie Elemente aus einer Liste mit Lambda basierend auf einer anderen Liste
- 16. Kopiere std :: vector in std :: array
- 17. JQuery: Entfernen Sie doppelte Elemente?
- 18. XTemplate Definition für Elemente Eigenschaft eines ListItem
- 19. Mehrere Objekte aus einem std :: vector löschen?
- 20. entfernen Sie Elemente in einer Liste in einer anderen Liste
- 21. Gebäude Hash, basierend auf einer Eigenschaft der Elemente Array von Objekten Gruppierung
- 22. Elemente aus einer Combobox entfernen
- 23. Können Sie Elemente aus einer std :: list entfernen, während Sie sie durchlaufen?
- 24. Entfernen Sie Elemente eines Vektors, die Teilzeichenfolgen eines anderen sind
- 25. Initialisieren eines zweidimensionalen std :: vector
- 26. Python. Entfernen Sie doppelte Elemente aus einer Liste der Liste
- 27. Ersetzen shared_ptr Elemente in Std :: Vektor
- 28. Wie kann ich gemischte Elemente in einer std :: map speichern?
- 29. Bewertungsreihenfolge der Elemente in einer Initialisierungsliste
- 30. Reduzieren der Größe eines std :: vector ohne einen Standardkonstruktor
vergaß ich remove_if() +1 . –
Sehr cool. Nie zuvor gesehen. +1 – Bernard
Danke, das hat den Trick gemacht. –