Criando uma duplicata de vetor
Ao anexar um vetor a si mesmo, é desejável evitar o uso de loops por motivos de desempenho. A função std::vector::insert, embora seja uma opção, não permite o uso de um iterador para *this.
Abordando o problema com std::copy
Usar std::copy para resolver esse problema pode parecer uma solução, mas essa abordagem pode levar a falhas de segmentação.
O Ideal Solução
A solução ideal envolve o uso de redimensionamento (ou reserva) e cópia_n. Veja como funciona:
auto old_count = xx.size(); xx.resize(2 * old_count); std::copy_n(xx.begin(), old_count, xx.begin() old_count);
Este código primeiro armazena o tamanho do vetor original em old_count. Em seguida, ele redimensiona xx para dobrar sua capacidade. Finalmente, std::copy_n copia os elementos do início de xx até o final de xx, duplicando efetivamente o vetor.
Alternativamente, você pode usar reserve em vez de resize:
auto old_count = xx.size(); xx.reserve(2 * old_count); std::copy_n(xx.begin(), old_count, std::back_inserter(xx));
Ao usar reserva, copy_n é essencial, pois o iterador end() aponta além do final, tornando-o inválido para inserções.
Esta abordagem satisfaz as condições descritas em 23.3.6.5 [vector.modifiers], garantindo que iteradores e referências antes do ponto de inserção permaneçam válido e nenhuma realocação ocorre, se possível.
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