"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 > ## **Os iteradores retornados por `std::vector::erase` apontam para elementos válidos após a remoção?**

## **Os iteradores retornados por `std::vector::erase` apontam para elementos válidos após a remoção?**

Publicado em 2024-11-09
Navegar:818

## **Do `std::vector::erase`-returned iterators Point to Valid Elements After Removal?**

Invalidação de iteradores std::vector: uma explicação detalhada

O conceito de invalidação de iterador em std::vector tem sido frequentemente discutido. Para esclarecer, o apagamento de elementos vetoriais via std::vector::erase invalida iteradores posicionados estritamente após o elemento apagado.

No entanto, a validade do iterador na posição exata do elemento apagado permanece incerta. Logicamente, pode-se assumir que este iterador permanece válido, uma vez que a implementação subjacente do vetor geralmente desloca os elementos restantes para preencher o espaço vazio. No entanto, o comportamento preciso e o potencial para resultados indefinidos são menos certos.

Considere o exemplo a seguir, que ilustra a remoção de números inteiros ímpares de um vetor:

typedef std::vector vectype;
vectype vec;

for (int i = 0; i 

Embora este código pareça ser executado sem erros na prática, sua validade permanece discutível.

A resposta está no comportamento do apagamento: ele de fato invalida todos os iteradores no ou após o iterador( s) passado para apagar. No entanto, ele também retorna um novo iterador imediatamente após o(s) elemento(s) apagado(s) ou até o final se tal elemento não existir. Este iterador pode ser usado para retomar a iteração.

É importante observar que o método acima de remoção de números inteiros ímpares é ineficiente (O(n2)) porque cada apagamento requer uma mudança de todos elementos subsequentes. O idioma apagar-remover oferece uma solução muito mais eficiente (O(n)):

bool is_odd(int x) { return (x % 2) == 1; }
vec.erase(std::remove_if(vec.begin(), vec.end(), is_odd), vec.end());
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