Compreendendo a diferença entre std::erase e std::remove
O algoritmo std::remove é uma ferramenta versátil projetada para operar em qualquer par de iteradores diretos, tornando-o aplicável a uma ampla variedade de contêineres e cenários. Ao contrário de sua contraparte std::erase, que efetivamente exclui e remove elementos de um contêiner, std::remove apenas reorganiza os elementos.
1. Descobrindo as nuances de std::remove
std::remove funciona particionando logicamente o contêiner em duas seções: uma seção contendo os elementos a serem removidos e uma seção contendo os elementos restantes. Ele faz isso iterando pelo contêiner e movendo os elementos não removidos para frente, sobrescrevendo efetivamente os elementos removidos. No entanto, é importante observar que std::remove na verdade não apaga os elementos excluídos; eles permanecem na memória, mas ficam efetivamente ocultos da visualização.
Esse comportamento se torna evidente ao usar std::remove em conjunto com a função container size(). Depois de remover um elemento usando std::remove, std::size() continuará retornando o tamanho original do contêiner, mesmo que alguns elementos sejam excluídos logicamente. O tamanho do contêiner só muda após usar std::erase para remover fisicamente os elementos ocultos.
2. Visualizando o impacto de std::remove
Considere o trecho de código fornecido na pergunta original:
std::vector a;
a.push_back(1);
a.push_back(2);
std::remove(a.begin(), a.end(), 1);
int s = a.size();
Depois de executar std::remove, o vetor ainda contém dois elementos (2 e 2), mas o primeiro elemento (1) é logicamente excluído e oculto da visualização. Portanto, std::size() retorna 2, apesar da presença de um elemento excluído oculto.
3. Empregando std::erase para remoção física
Para remover fisicamente elementos excluídos e atualizar o tamanho do contêiner, std::erase entra em ação. Ao invocar std::erase com o par de iteradores retornado por std::remove como o primeiro argumento, você pode eliminar os elementos excluídos ocultos e reduzir o tamanho do contêiner:
a.erase(std::remove(a.begin(), a.end(), 1), a.end());
Neste caso, std::erase remove fisicamente o elemento 1, deixando o vetor com um único elemento (2) e um tamanho atualizado de 1.
4. Compreendendo o escopo do utilitário std::remove
Embora std::remove não seja projetado apenas para ser usado em conjunto com std::erase, ele encontra uso extensivo em vários cenários onde o particionamento lógico de elementos são necessários. Por exemplo, você pode empregar std::remove para:
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3