wake-up-neo.com

C++ Vektorelement nach Wert statt nach Position löschen?

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?

213
Jake Wilson

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.

335
Georg Fritzsche

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);
75
zneak

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.

10
Naveen

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

0
kometen