最常用、最直观的方式是vec1.insert(vec1.end(), vec2.begin(), vec2.end());需类型一致,大体积数据前建议reserve;也可用std::copy+back_inserter实现解耦拼接;禁用assign或swap以免误删数据;移动语义下可用make_move_iterator提升性能。

用 insert 在 vector 末尾追加另一个 vector
最常用、最直观的方式是调用 insert,指定插入位置为 vec1.end(),再传入另一个 vector 的迭代器范围。这本质上是批量 push_back,但效率更高(避免多次内存重分配)。
- 写法:
vec1.insert(vec1.end(), vec2.begin(), vec2.end()); - 注意:
vec2必须和vec1元素类型一致,否则编译报错(如error: no matching member function for call to 'insert') - 如果
vec2很大,且vec1容量不足,insert会自动扩容——此时可提前调用vec1.reserve(vec1.size() + vec2.size())避免重复拷贝
用 std::copy + back_inserter 实现流式拼接
适合需要解耦“源”和“目标”的场景,比如拼接逻辑封装在函数里,或目标容器类型将来可能换成其他支持 push_back 的容器(如 deque)。
- 写法:
std::copy(vec2.begin(), vec2.end(), std::back_inserter(vec1)); - 依赖头文件:
<algorithm>和<iterator> - 性能略低于
insert(每次调用push_back可能触发检查容量),但语义更清晰:「把 vec2 的每个元素追加到 vec1 尾部」 - 不适用于 const 或移动后的
vec2——因为copy是只读遍历
避免直接用 assign 或 swap 拼接
assign 会清空原 vector 再赋值,swap 是交换整个对象,二者都不是拼接操作,误用会导致数据丢失。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 错误示例:
vec1.assign(vec2.begin(), vec2.end());→vec1原内容全没了 - 错误示例:
vec1.swap(vec2);→vec1变成原来vec2的内容,不是拼接 - 如果真想“把两个 vector 合成一个新 vector”,应显式构造:
std::vector<int> result(vec1); result.insert(result.end(), vec2.begin(), vec2.end());
移动语义下高效拼接(C++11 起)
若 vec2 后续不再使用,可用 std::move 避免元素逐个拷贝,尤其对含动态资源的类型(如 std::string、自定义类)收益明显。
立即学习“C++免费学习笔记(深入)”;
- 写法:
vec1.insert(vec1.end(), std::make_move_iterator(vec2.begin()), std::make_move_iterator(vec2.end())); - 必须配对使用
std::make_move_iterator,仅写std::move(vec2.begin())无效(迭代器本身没有移动语义) - 执行后
vec2处于有效但未定义状态,不能再访问其元素(但可安全析构或重新赋值)
insert 就够了;真正要注意的是别混淆“拼接”和“替换”,以及别忘了大体积数据前的 reserve。

















