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.
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