最常用且安全的合并方式是vector::insert在尾部插入另一vector所有元素;move语义适用于需清空源vector的场景;std::merge仅限两已排序vector归并;operator+不被标准vector支持。

vector::insert 一次性合并两个 vector
直接在目标 vector 尾部插入另一个 vector 的所有元素,是最常用也最安全的做法。它不改变源 vector,语义清晰,且能自动处理内存扩容。
- 用
vec1.insert(vec1.end(), vec2.begin(), vec2.end()),不是push_back循环——后者效率低、可能多次 realloc - 如果
vec2很大,提前调用vec1.reserve(vec1.size() + vec2.size())能避免中间扩容,尤其在性能敏感场景 - 注意:
vec2必须和vec1元素类型一致,否则编译报错no matching function for call to 'insert'
move 语义合并(清空源 vector)
当确定不再需要 vec2 的内容时,用移动插入可避免深拷贝,尤其对含动态资源的类型(如 std::string、自定义类)收益明显。
- 写法是
vec1.insert(vec1.end(), std::make_move_iterator(vec2.begin()), std::make_move_iterator(vec2.end())) - 执行后
vec2处于有效但未定义状态(通常为空),不能再访问其元素值;若之后还要用vec2,别用 move - 对
int、double等 trivial 类型,move 和 copy 没区别,编译器会优化掉
用 std::merge 前提是两个 vector 已排序
std::merge 不是通用合并函数,它只做归并排序中的“归并”一步:输入两个**已升序排列**的区间,输出一个升序结果。误用会导致逻辑错误或越界。
- 必须包含
<algorithm></algorithm>,且目标容器需预留足够空间:vec3.resize(vec1.size() + vec2.size()) - 调用形式:
std::merge(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), vec3.begin()) - 如果原 vector 无序,先
std::sort再 merge,总开销远超直接insert,除非你本来就在做归并排序
operator+ 重载不适用于 vector
C++ 标准库的 std::vector 没有定义 operator+,写 auto v = v1 + v2 会编译失败,错误信息是 invalid operands to binary expression ('std::vector<int>' and 'std::vector<int>')</int></int>。
立即学习“C++免费学习笔记(深入)”;
- 有人封装成辅助函数,但容易和 STL 习惯冲突,团队协作时反而增加理解成本
- 更糟的是,某些第三方头文件(比如旧版 Boost 或自制工具库)可能偷偷加了
operator+,导致跨平台编译行为不一致 - 老老实实用
insert或封装成命名明确的函数(如concat),比依赖隐式运算符更可控
合并 vector 看似简单,但 move 时机、是否排序、目标容量预估这三点,实际项目里十次有八次会漏判。特别是把 std::merge 当通用合并用,调试时很难一眼看出问题在哪。










