C ++ Apaga elemento vetorial por valor em vez de por posição?

vector myVector; 

e vamos dizer que os valores no vetor são isso (nesta ordem):

 5 9 2 8 0 7 

Se eu quisesse apagar o elemento que contém o valor de “8”, acho que faria isso:

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

Porque isso apagaria o 4º elemento. Mas existe alguma maneira de apagar um elemento baseado no valor “8”? Gostar:

 myVector.eraseElementWhoseValueIs(8); 

Ou simplesmente preciso iterar por todos os elementos do vetor e testar seus valores?

Como cerca de std::remove() vez disso:

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

Essa combinação também é conhecida como a expressão apagar apagar .

Você pode usar std::find para obter um iterador para um valor:

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

Você não pode fazer isso diretamente. Você precisa usar o algoritmo std::remove para mover o elemento a ser apagado até o final do vetor e depois usar a function erase . Algo como: myVector.erase(std::remove(myVector.begin(), myVector.end(), 8), myVec.end()); . Veja isto apagando elementos do vetor para mais detalhes.

Eric Niebler está trabalhando em uma proposta de intervalo e alguns dos exemplos mostram como remover certos elementos. Removendo 8. Cria um novo vetor.

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

saídas

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

Intereting Posts