C ++ Cancellare il vettore in base al valore piuttosto che alla posizione?

vector myVector; 

e diciamo che i valori nel vettore sono questo (in questo ordine):

 5 9 2 8 0 7 

Se volessi cancellare l’elemento che contiene il valore di “8”, penso che lo farei:

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

Perché questo cancellerebbe il 4 ° elemento. Ma esiste un modo per cancellare un elemento basato sul valore “8”? Piace:

 myVector.eraseElementWhoseValueIs(8); 

O ho semplicemente bisogno di scorrere tutti gli elementi del vettore e testarne i valori?

Che ne dici di std::remove() invece:

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

Questa combinazione è anche nota come idioma di cancellazione-cancellazione .

Puoi usare std::find per ottenere un iteratore su un valore:

 #include  std::vector::iterator position = std::find(myVector.begin(), myVector.end(), 8); if (position != myVector.end()) // == myVector.end() means the element was not found myVector.erase(position); 

Non puoi farlo direttamente. Devi usare std::remove algorithm per spostare l’elemento da cancellare alla fine del vettore e quindi usare la funzione di erase . Qualcosa come: myVector.erase(std::remove(myVector.begin(), myVector.end(), 8), myVec.end()); . Vedi questo elementi di cancellazione dal vettore per maggiori dettagli.

Eric Niebler sta lavorando su una proposta di intervallo e alcuni degli esempi mostrano come rimuovere determinati elementi. Rimozione 8. Crea un nuovo vettore.

 #include  #include  int main(int argc, char const *argv[]) { std::vector vi{2,4,6,8,10}; for (auto& i : vi) { std::cout < < i << std::endl; } std::cout << "-----" << std::endl; std::vector vim = vi | ranges::view::remove_if([](int i){return i == 8;}); for (auto& i : vim) { std::cout < < i << std::endl; } return 0; } 

uscite

2
4
6
8
10
-----
2
4
6
10