c++中如何合并两个vector_c++合并两个容器元素的技巧【实例】

最稳妥的方式是用 insert 或 std::copy;std::merge 仅适用于已排序 vector,误用会导致逻辑错误或越界。

直接用 insertstd::copy 最稳妥,std::merge 仅适用于已排序的 vector,误用会导致逻辑错误或越界。

insert 在末尾追加另一个 vector

这是最常用、最直观的方式,时间复杂度 O(n),内部自动处理内存扩容。

  • 调用 vec1.insert(vec1.end(), vec2.begin(), vec2.end())
  • 不改变 vec2,也不要求两者有序
  • 如果 vec1 容量不足,会触发 reallocation,但对用户透明
  • 注意:不要写成 vec1.insert(vec1.end(), vec2) —— 编译不过,insert 不接受容器整体作为参数
std::vector a = {1, 2};
std::vector b = {3, 4, 5};
a.insert(a.end(), b.begin(), b.end()); // a 变为 {1, 2, 3, 4, 5}

std::copy + back_inserter 实现流式追加

适合需要解耦“源”和“目标”、或配合其他算法的场景,语义更明确,但略冗长。

  • 头文件需包含
  • std::copy(b.begin(), b.end(), std::back_inserter(a))
  • 本质和 insert 效果一致,但每次调用 push_back,可能多次触发容量检查
  • 若确定目标容量足够,可先调用 a.reserve(a.size() + b.size()) 避免重复分配
#include 
#include 
std::vector a = {10, 20};
std::vector b = {30, 40};
a.reserve(a.size() + b.size());
std::copy(b.begin(), b.end(), std::back_inserter(a));

std::merge 合并两个有序 vector

仅当两个 vector 都已升序(或同向有序)时才适用,结果也保持有序。不是“合并”,而是“归并”。

  • 头文件需包含

  • 目标容器必须预留足够空间:result.resize(a.size() + b.size())
  • 传入的是迭代器范围,不是容器本身;输出迭代器必须可写
  • 若输入无序,结果不可预测,且不会报错 —— 这是最容易踩的坑
std::vector a = {1, 4, 6};
std::vector b = {2, 3, 5, 7};
std::vector result;
result.resize(a.size() + b.size());
std::merge(a.begin(), a.end(), b.begin(), b.end(), result.begin());

避免用 assignswap 做合并

assign 会清空原容器再赋值,swap 是交换而非合并 —— 这两类操作语义不符,强行套用会导致数据丢失或逻辑混乱。

  • vec1.assign(vec2.begin(), vec2.end())vec1 变成 vec2 的副本,原内容全丢
  • vec1.swap(vec2) → 两者内容互换,不是合并
  • 想“把两个 vector 合成一个新 vector”?直接构造:std::vector c(a.begin(), a.end()); c.insert(c.end(), b.begin(), b.end());

真正要注意的是:没有“万能合并函数”,选哪种方式取决于你是否需要保持有序、是否在意性能微差、以及是否在泛型上下文中使用。别只看名字里有“merge”就用 std::merge