Quero limpar um elemento de um vetor usando o método erase. Mas o problema aqui é que não é garantido que o elemento ocorra apenas uma vez no vetor. Pode estar presente várias vezes e preciso limpar todos eles. Meu código é mais ou menos assim:
void erase(std::vector<int>& myNumbers_in, int number_in)
{
std::vector<int>::iterator iter = myNumbers_in.begin();
std::vector<int>::iterator endIter = myNumbers_in.end();
for(; iter != endIter; ++iter)
{
if(*iter == number_in)
{
myNumbers_in.erase(iter);
}
}
}
int main(int argc, char* argv[])
{
std::vector<int> myNmbers;
for(int i = 0; i < 2; ++i)
{
myNmbers.push_back(i);
myNmbers.push_back(i);
}
erase(myNmbers, 1);
return 0;
}
Esse código obviamente falha porque estou alterando o final do vetor enquanto itero por ele. Qual a melhor maneira de alcançar isto? Ou seja, há alguma maneira de fazer isso sem iterar o vetor várias vezes ou criar mais uma cópia do vetor?
std::remove()
desloca elementos de forma que os elementos a serem removidos sejam sobrescritos. O algoritmo não muda o tamanho do container, e se osn
elementos são removidos então fica indefinido quais são os últimosn
elementos.