"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 > Como duplicar um vetor com eficiência em C++ sem loops?

Como duplicar um vetor com eficiência em C++ sem loops?

Publicado em 2024-12-22
Navegar:595

How to Efficiently Duplicate a Vector in C   Without Loops?

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.

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