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.
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\nMétodo n.º 1: insert() — el clásico del género
\n\nEl 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:
#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\nCó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.
Ventajas y desventajas de insert()
\n- \n
- ✅ Ventajas: Simplicidad, legibilidad, funciona con cualquier tipo. \n
- ❌ Desventajas: Si
vec1es pequeño yvec2es 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
Consejo: Si conoces el tamaño final, llama a vec1.reserve(vec1.size() + vec2.size()) de antemano. Esto evitará asignaciones innecesarias.
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>.
#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\nTen 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).
¿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
Método n.º 3: Move semantics — velocidad para C++11 y posteriores
\n\nSupongamos que no necesitas los vectores originales después de