Concatenación de std::vector en C++: 3 mejores formas con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: ¿Por qué concatenar vectores y por qué es difícil?

\n\n

¡Hola, colega! Si alguna vez has escrito código en C++ que procesa listas de datos, seguramente te has enfrentado a la tarea: «Tengo dos std::vector, ¿cómo hago uno solo?». Esta pregunta es todo un éxito en Stack Overflow (¡miles de visitas!), y no es para menos. A simple vista parece: ¿qué tiene de complicado? vector1 + vector2, ¿como en Python? Pues no. En C++, el operador + no está definido para vectores. Hay que ingeniárselas.

\n\n

Hoy analizaremos a fondo la concatenación de dos std::vectors. Te mostraré 3 métodos probados, te explicaré cuándo usar cada uno y te advertiré sobre los errores en los que incluso los desarrolladores experimentados tropiezan. ¡Allá vamos!

\n\n

Método n.º 1: insert() — el clásico del género

\n\n

El método más obvio y utilizado es insert(). Permite insertar todos los elementos de un vector al final de otro. La sintaxis es simple y elegante:

\n\n
#include <iostream>\n#include <vector>\n\nint main() {\n    std::vector<int> vec1 = {1, 2, 3};\n    std::vector<int> vec2 = {4, 5, 6};\n\n    // Concatenamos: insertamos vec2 al final de vec1\n    vec1.insert(vec1.end(), vec2.begin(), vec2.end());\n\n    // Salida: 1 2 3 4 5 6\n    for (int v : vec1) std::cout << v << " ";\n    return 0;\n}
\n\n

Cómo funciona: Le decimos al compilador: «A partir de la posición vec1.end() (es decir, después del último elemento del primer vector), copia todo lo que está entre vec2.begin() y vec2.end()». Voilà — la unión de vectores en C++ está hecha.

\n\n

Ventajas y desventajas de insert()

\n
    \n
  • ✅ Ventajas: Simplicidad, legibilidad, funciona con cualquier tipo.
  • \n
  • ❌ Desventajas: Si vec1 es pequeño y vec2 es enorme, durante la inserción pueden ocurrir varias reasignaciones de memoria. Esto reduce el rendimiento en la concatenación de vectores de gran tamaño.
  • \n
\n\n

Consejo: Si conoces el tamaño final, llama a vec1.reserve(vec1.size() + vec2.size()) de antemano. Esto evitará asignaciones innecesarias.

\n\n

Método n.º 2: std::merge() — para datos ordenados

\n\n

¿Y si tus vectores ya están ordenados? ¿O si no solo necesitas concatenar, sino obtener un único array ordenado? Aquí entra en escena el algoritmo std::merge del archivo de cabecera <algorithm>.

\n\n
#include <iostream>\n#include <vector>\n#include <algorithm> // para std::merge\n\nint main() {\n    std::vector<int> vec1 = {1, 3, 5};\n    std::vector<int> vec2 = {2, 4, 6};\n    std::vector<int> result;\n\n    // Reservamos espacio para evitar copias innecesarias\n    result.reserve(vec1.size() + vec2.size());\n\n    // Fusionamos dos rangos ordenados\n    std::merge(vec1.begin(), vec1.end(),\n               vec2.begin(), vec2.end(),\n               std::back_inserter(result));\n\n    // Salida: 1 2 3 4 5 6\n    for (int v : result) std::cout << v << " ";\n    return 0;\n}
\n\n

Ten en cuenta: std::merge requiere que ambos rangos de entrada estén ordenados de forma ascendente. Si no es así, el resultado será impredecible. Pero si los datos están ordenados, este método es el rey del rendimiento: complejidad O(n + m).

\n\n

¿Cuándo usar std::merge?

\n
    \n
  • Si estás combinando los resultados de dos consultas SQL o registros ordenados por tiempo.
  • \n
  • Cuando necesitas no solo concatenating two std::vectors, sino una fusión ordenada.
  • \n
  • Si los vectores originales no se pueden modificar (creamos un tercer vector result).
  • \n
\n\n

Método n.º 3: Move semantics — velocidad para C++11 y posteriores

\n\n

Supongamos que no necesitas los vectores originales después de

Blogs

Book Recommendations