Introdução: Por que juntar vetores e por que isso é difícil?
\n\nOlá, colega! Se você já escreveu código em C++ que processa listas de dados, certamente já se deparou com a tarefa: "Eu tenho dois std::vector, como transformá-los em um só?" Essa pergunta é um verdadeiro sucesso no Stack Overflow (milhares de visualizações!), e não é à toa. À primeira vista, parece: o que há de tão difícil? vector1 + vector2, como em Python? Pois é, não é assim. Em C++, o operador + não está definido para vetores. Temos que dar um jeito.
Hoje vamos abordar a junção de dois std::vectors do início ao fim. Vou mostrar 3 maneiras comprovadas, explicar quando usar cada uma e alertar sobre as armadilhas que até desenvolvedores experientes enfrentam. Vamos lá!
\n\nMétodo nº 1: insert() — o clássico do gênero
\n\nO método mais óbvio e frequentemente usado é o método insert(). Ele permite inserir todos os elementos de um vetor no final de outro. A sintaxe é simples e 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 // Juntando: inserindo vec2 no final de vec1\n vec1.insert(vec1.end(), vec2.begin(), vec2.end());\n\n // Saída: 1 2 3 4 5 6\n for (int v : vec1) std::cout << v << " ";\n return 0;\n}\n\nComo funciona: Dizemos ao compilador: "A partir da posição vec1.end() (ou seja, após o último elemento do primeiro vetor), copie tudo que está entre vec2.begin() e vec2.end()". Pronto — a união de vetores C++ está feita.
Prós e contras do insert()
\n- \n
- ✅ Prós: Simplicidade, legibilidade, funciona com qualquer tipo. \n
- ❌ Contras: Se
vec1for pequeno evec2for enorme, podem ocorrer várias realocações de memória durante a inserção. Isso reduz o desempenho na concatenação de vetores de grandes volumes. \n
Dica: Se você souber o tamanho final, chame vec1.reserve(vec1.size() + vec2.size()) antecipadamente. Isso evita alocações desnecessárias.
Método nº 2: std::merge() — para dados ordenados
\n\nE se seus vetores já estiverem ordenados? Ou se você precisar não apenas juntar, mas obter um único array ordenado? É aí que entra o algoritmo std::merge do cabeçalho <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 espaço para evitar cópias desnecessárias\n result.reserve(vec1.size() + vec2.size());\n\n // Mesclamos dois intervalos ordenados\n std::merge(vec1.begin(), vec1.end(),\n vec2.begin(), vec2.end(),\n std::back_inserter(result));\n\n // Saída: 1 2 3 4 5 6\n for (int v : result) std::cout << v << " ";\n return 0;\n}\n\nObserve: std::merge exige que ambos os intervalos de entrada estejam ordenados em ordem crescente. Caso contrário, o resultado será imprevisível. Mas se os dados estiverem ordenados, este método é o rei do desempenho: complexidade O(n + m).
Quando usar std::merge?
\n- \n
- Se você está combinando resultados de duas consultas SQL ou logs ordenados por tempo. \n
- Quando você precisa não apenas de concatenating two std::vectors, mas especificamente de uma mesclagem ordenada. \n
- Se os vetores originais não podem ser alterados (criamos um terceiro vetor
result). \n
Método nº 3: Move semantics — velocidade para C++11 e versões posteriores
\n\nSuponha que você não precise mais dos vetores originais