vector<int> myVector;
und lassen Sie uns sagen, die Werte im Vektor sind dies (in dieser Reihenfolge):
5 9 2 8 0 7
Wenn ich das Element löschen wollte, das den Wert "8" enthält, würde ich Folgendes tun:
myVector.erase(myVector.begin()+4);
Denn das würde das 4. Element löschen. Aber gibt es eine Möglichkeit, ein Element basierend auf dem Wert "8" zu löschen? Mögen:
myVector.eraseElementWhoseValueIs(8);
Oder muss ich einfach nur alle Vektorelemente durchlaufen und deren Werte testen?
Wie wäre es mit std::remove()
stattdessen:
#include <algorithm>
...
vec.erase(std::remove(vec.begin(), vec.end(), 8), vec.end());
Diese Kombination wird auch als erase-remove idiom bezeichnet.
Sie können std::find
verwenden, um einen Iterator auf einen Wert zu bekommen:
#include <algorithm>
std::vector<int>::iterator position = std::find(myVector.begin(), myVector.end(), 8);
if (position != myVector.end()) // == myVector.end() means the element was not found
myVector.erase(position);
Das kannst du nicht direkt machen. Sie müssen den Algorithmus std::remove
verwenden, um das zu löschende Element an das Ende des Vektors zu verschieben, und anschließend die Funktion erase
verwenden. So etwas wie: myVector.erase(std::remove(myVector.begin(), myVector.end(), 8), myVec.end());
. Siehe Elemente aus dem Vektor löschen für weitere Details.
Eric Niebler arbeitet an einem Sortimentsvorschlag und einige Beispiele zeigen, wie bestimmte Elemente entfernt werden. Entfernen 8. Erstellt einen neuen Vektor.
#include <iostream>
#include <range/v3/all.hpp>
int main(int argc, char const *argv[])
{
std::vector<int> vi{2,4,6,8,10};
for (auto& i : vi) {
std::cout << i << std::endl;
}
std::cout << "-----" << std::endl;
std::vector<int> vim = vi | ranges::view::remove_if([](int i){return i == 8;});
for (auto& i : vim) {
std::cout << i << std::endl;
}
return 0;
}
ausgänge
2
4
6
8
10
-----
2
4
6
10