Editar: a documentação para std::remove
foi corrigida desde que esta resposta foi escrita. A mesma coisa se aplica a list::remove
.
Deixe-me dar um exemplo para mostrar como o cpluscplus.com pode errar.
Considere a std::remove
função de <algorithm>
.
O fato é que std::remove
não remove o item do contêiner. É porque std::remove
funciona apenas com um par de iteradores e não sabe nada sobre o contêiner que realmente contém os itens. De fato, não é possível std::remove
conhecer o contêiner subjacente, porque não há como ir de um par de iteradores para descobrir sobre o contêiner ao qual os iteradores pertencem. Então std::remove
, realmente não remove os itens, simplesmente porque não pode . A única maneira de realmente remover um item de um contêiner é invocar uma função de membro nesse contêiner.
Portanto, se você deseja remover os itens, use Erase-Remove Idiom :
v.erase(std::remove(v.begin(), v.end(), 10), v.end());
Mas cplusplus.com
fornece informações incorretas sobre std::remove
. Diz
Observe que essa função não altera os elementos além do novo fim, que mantêm seus valores antigos e ainda estão acessíveis .
o que não está correto. O iterador no intervalo [new_end, old_end)
ainda é desreferenciável, mas isso NÃO significa que eles mantêm os valores antigos e ainda estão acessíveis. Eles não são especificados.
Da mesma forma, também cplusplus.com
fornece informações incorretaslist::remove
. Ele diz ,
Observe que uma função de algoritmo global, remove, existe com um comportamento semelhante, mas operando entre dois iteradores.
o que está completamente errado. A remoção global, ou std::remove
seja, não é semelhante a list::remove
, como vimos que o antigo NÃO remove realmente os itens do contêiner porque não pode , enquanto o último (a função de membro) remove os itens porque pode .
Esta resposta é copiada da minha outra resposta no tópico a seguir, com poucas modificações:
Nota: Desde que me deparei com isso recentemente, quando estava respondendo no tópico acima, lembro-me dele. Existem muitos erros que encontrei nos últimos dois anos, dos quais não me lembro. Posso acrescentar mais alguns depois, se me deparar novamente.