"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Qual é a diferença entre `std::remove` e `std::erase` em C++?

Qual é a diferença entre `std::remove` e `std::erase` em C++?

Publicado em 2024-11-11
Navegar:128

 What\'s the Difference Between `std::remove` and `std::erase` in C  ?

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:

  • Elementos de partição que atendem a critérios específicos daqueles que não atendem.
  • Agrupar elementos semelhantes.
  • Encontre a posição de um elemento específico ou conjunto de elementos.
Tutorial mais recente Mais>

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