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());
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