合并vector最常用安全方式是insert()或c++23的append();c风格数组需显式传长度;去重排序应分两步;array需转vector或手拷贝;span仅是视图不真正合并。

合并两个 std::vector 最常用且安全的方式
直接用 insert() 或 append()(C++23)最省心,避免手动管理内存和越界。多数场景下别手写循环拼接——容易漏掉大小检查或迭代器失效。
-
vec1.insert(vec1.end(), vec2.begin(), vec2.end()):把vec2所有元素追加到vec1末尾,原地修改,时间复杂度 O(n) - C++23 起可写
vec1.append(vec2),语义更清晰,但需确认编译器支持(GCC 13+、Clang 16+) - 若不想修改原容器,用构造函数:
std::vector<int> merged(vec1); merged.insert(merged.end(), vec2.begin(), vec2.end());</int>
合并两个 C 风格数组(int arr1[5] 这类)必须自己算长度
C 风格数组不带长度信息,sizeof(arr)/sizeof(arr[0]) 只在定义处有效;传参后退化为指针,sizeof 就失效了。这是最常踩的坑。
- 必须显式传入两个长度参数,例如:
void merge_arrays(int* a, size_t len_a, int* b, size_t len_b, int* out) - 目标数组
out必须提前分配足够空间(len_a + len_b),否则写越界 - 用
std::copy比裸循环更安全:std::copy(a, a + len_a, out); std::copy(b, b + len_b, out + len_a);
合并时需要去重或排序?别现场写逻辑
如果合并后要唯一或有序,不要在合并过程中边插边判重——性能差、代码乱。分两步更清晰可靠。
- 先无条件合并(用上面任一方式)
- 再调用
std::sort+std::unique:std::sort(merged.begin(), merged.end()); auto it = std::unique(merged.begin(), merged.end()); merged.erase(it, merged.end()); - 注意
std::unique只移除相邻重复项,所以必须先排序
std::array 合并不能直接用 insert,得转成 vector 或手拷贝
std::array 是固定大小栈对象,没有动态插入接口。想“合并”两个 std::array<int></int> 和 std::array<int></int>,结果必然是另一个不同尺寸的容器(比如 std::array<int></int> 或 std::vector)。
- 若尺寸已知且固定,可声明目标
std::array并用std::copy填充:std::array<int> out; std::copy(arr1.begin(), arr1.end(), out.begin()); std::copy(arr2.begin(), arr2.end(), out.begin() + arr1.size());</int> - 更通用的做法是转成
std::vector再合并,避免硬编码尺寸 - 别试图用
std::span“假装合并”——它只是视图,不拥有数据,也不改变原始数组布局
合并操作本身简单,真正容易出问题的是对源/目标容器生命周期、所有权和尺寸边界的误判。尤其传参时数组退化、std::array 尺寸模板参数不可推导、以及 std::unique 的前置排序要求,这几个点漏掉一个就可能引发未定义行为。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











