Junção de std::vector em C++: 3 melhores maneiras com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: Por que juntar vetores e por que isso é difícil?

\n\n

Olá, 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.

\n\n

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\n

Método nº 1: insert() — o clássico do gênero

\n\n

O 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:

\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    // 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\n

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

\n\n

Prós e contras do insert()

\n
    \n
  • ✅ Prós: Simplicidade, legibilidade, funciona com qualquer tipo.
  • \n
  • ❌ Contras: Se vec1 for pequeno e vec2 for 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
\n\n

Dica: Se você souber o tamanho final, chame vec1.reserve(vec1.size() + vec2.size()) antecipadamente. Isso evita alocações desnecessárias.

\n\n

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

\n\n

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

\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 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\n

Observe: 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).

\n\n

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
\n\n

Método nº 3: Move semantics — velocidade para C++11 e versões posteriores

\n\n

Suponha que você não precise mais dos vetores originais

Blogs

Book Recommendations