"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 > Por que erase-remove_if deixa pares duplicados ao remover elementos de um `std::vector`?

Por que erase-remove_if deixa pares duplicados ao remover elementos de um `std::vector`?

Publicado em 23/12/2024
Navegar:174

Why does erase-remove_if leave behind duplicate pairs when removing elements from a `std::vector`?

Idioma Erase-Remove_if para remoção de pares

Ao tentar empregar o idioma erase-remove_if para eliminar pares de um std::vector>, surge um problema peculiar. Apesar de almejar pares com um valor .first de 4 para remoção, a implementação inicial deixa para trás um par duplicado:

stopPoints.erase(std::remove_if(stopPoints.begin(),
                                stopPoints.end(),
                                [&](const stopPointPair stopPoint)-> bool { return stopPoint.first == 4; }));

A raiz do problema está no processo de apagamento incompleto. std::erase_if apenas desloca os elementos correspondentes para o final do vetor; isso não os remove. Para completar a remoção, a abordagem correta é usar o iterador retornado por std::remove_if como ponto de partida para o apagamento:

stopPoints.erase(std::remove_if(stopPoints.begin(),
                                stopPoints.end(),
                                [](const stopPointPair stopPoint)-> bool 
                                       { return stopPoint.first == 4; }), 
                 stopPoints.end());

Compreendendo o mecanismo Erase-Remove_if:

  • Troca de elementos: std::remove_if troca elementos dentro do vetor, empurrando todos os elementos incompatíveis para o início. Os elementos correspondentes terminam na parte traseira do vetor.
  • Iteração de predicado: A expressão lambda de predicado determina quais elementos remover. Se o predicado retornar verdadeiro, o elemento correspondente é movido para o final do vetor.
  • Iterator Retrieval: std::remove_if retorna um iterador apontando para o primeiro elemento que corresponde ao predicado; este iterador marca o início dos elementos a serem removidos.
  • Vector Erasure: std::vector::erase invoca a operação de apagamento de intervalo, começando no iterador retornado e estendendo-se até o vetor fim. Esta etapa remove todos os elementos correspondentes do vetor.

Para obter mais informações, consulte o artigo da Wikipedia sobre [Apagar-Remover idioma](https://en.wikipedia.org/ wiki/Apagar-remove_idiom).

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