"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo duplicar eficientemente un vector en C++ sin bucles?

¿Cómo duplicar eficientemente un vector en C++ sin bucles?

Publicado el 2024-12-22
Navegar:142

How to Efficiently Duplicate a Vector in C   Without Loops?

Creación de un vector duplicado

Al agregar un vector a sí mismo, es deseable evitar el uso de bucles por razones de rendimiento. La función std::vector::insert, aunque es una opción, no permite usar un iterador para *esto.

Acercándose al problema con std::copy

Usar std::copy para resolver este problema puede parecer una solución, pero este enfoque puede provocar errores de segmentación.

Lo óptimo Solución

La solución óptima implica usar resize (o reservar) y copy_n. Así es 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 primero almacena el tamaño del vector original en old_count. Luego cambia el tamaño de xx para duplicar su capacidad. Finalmente, std::copy_n copia los elementos desde el principio de xx hasta el final de xx, duplicando efectivamente el vector.

Alternativamente, puedes usar reserve en lugar de redimensionar:

auto old_count = xx.size();
xx.reserve(2 * old_count);
std::copy_n(xx.begin(), old_count, std::back_inserter(xx));

Cuando se usa reserve, copy_n es esencial ya que el iterador end() apunta más allá del final, lo que lo hace inválido para inserciones.

Este enfoque satisface las condiciones descritas en 23.3.6.5 [modificadores de vector], asegurando que los iteradores y las referencias antes de la inserción el punto sigue siendo válido y, si es posible, no se produce ninguna reasignación.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3