web-dev-qa-db-fra.com

C++ Effacer les éléments vectoriels par valeur plutôt que par position?

vector<int> myVector;

et disons que les valeurs dans le vecteur sont ceci (dans cet ordre):

5 9 2 8 0 7

Si je voulais effacer l'élément contenant la valeur "8", je pense que je le ferais:

myVector.erase(myVector.begin()+4);

Parce que cela effacerait le 4ème élément. Mais est-il possible d'effacer un élément basé sur la valeur "8"? Comme:

myVector.eraseElementWhoseValueIs(8);

Ou dois-je simplement simplement parcourir tous les éléments vectoriels et tester leurs valeurs?

213
Jake Wilson

Que diriez-vous de std::remove() à la place:

#include <algorithm>
...
vec.erase(std::remove(vec.begin(), vec.end(), 8), vec.end());

Cette combinaison est également appelée idiome erase-remove .

335
Georg Fritzsche

Vous pouvez utiliser std::find pour obtenir un itérateur à une valeur:

#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

Vous ne pouvez pas faire cela directement. Vous devez utiliser l'algorithme std::remove pour déplacer l'élément à effacer à la fin du vecteur, puis utiliser la fonction erase. Quelque chose comme: myVector.erase(std::remove(myVector.begin(), myVector.end(), 8), myVec.end());. Voir ceci effacer des éléments du vecteur pour plus de détails.

10
Naveen

Eric Niebler travaille sur une proposition de plage et certains des exemples montrent comment supprimer certains éléments. Supprimer 8. Crée un nouveau vecteur.

#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;
}

les sorties

2
4
6
8
dix
-----
2
4
6
dix

0
kometen