推荐用 std::copy 复制二维数组某一行,需传入行首地址和行尾地址(arr[i] + n),n 为列数;memcpy 需手动计算字节数且易出错;循环赋值最安全,尤其适用于非 pod 类型。

用 std::copy 复制某一行(推荐)
C++ 原生二维数组(如 int arr[5][10])本质是连续内存块,某一行是首地址加偏移,可直接用 std::copy 拷贝。关键点是:行内元素连续,但必须知道列数(即每行长度),不能只传 arr[i] 就完事。
- 要复制第
i行到一维数组dst,前提是dst至少有N个元素(N是列数) - 写法:
std::copy(arr[i], arr[i] + N, dst);
- 错误写法:
std::copy(arr[i], arr[i+1], dst)—— 对非指针数组(如栈上int[5][10])会编译失败,因为arr[i+1]类型不匹配 - 如果用
std::vector<:vector>></:vector>,则不能直接用arr[i]当迭代器起点,得用arr[i].begin()和arr[i].end()
用 memcpy 复制某一行(需谨慎)
memcpy 更底层、更快,但要求源和目标内存布局完全一致,且必须手动算字节数。
- 复制第
i行:memcpy(dst, &arr[i][0], N * sizeof(arr[0][0]));
- 容易踩坑:
- 忘记乘
sizeof→ 只拷了N字节而非N个元素 -
dst类型为int*但未初始化或越界,导致未定义行为 - 对
std::vector的data()使用memcpy可以,但对std::vector<:vector>></:vector>的某一行不行——因为内层vector是独立分配的,&v[i][0]不代表整行连续
- 忘记乘
用循环赋值最稳妥(适合初学者或复杂类型)
当元素是自定义类、含构造/析构逻辑,或你不确定内存是否连续时,显式循环最安全。
for (int j = 0; j
- 优点:语义清晰、无类型陷阱、支持
=重载 - 缺点:编译器通常能优化成
memcpy,但若N很小(比如 3~4),循环开销几乎可忽略;若N很大且性能敏感,优先选std::copy - 注意:别写成
dst[j] = arr[i+j]—— 这是跨行错位访问,常见笔误
如果用 std::array 或 std::vector 怎么办?
-
std::array<:array>, 5> arr;</:array>:第 i 行是 arr[i],直接赋值即可:std::array<int> row = arr[i];</int>
(深拷贝,安全)
-
std::vector<:vector>> arr;</:vector>:不能整体拷贝某“行”为原生数组,但可以:std::vector<int> row = arr[i]; // 拷贝构造</int>
或 std::copy(arr[i].begin(), arr[i].end(), dst);
- 别试图对
std::vector<:vector>></:vector> 做 memcpy —— 每行内存不连续,会出错
std::array<:array>, 5> arr;</:array>:第 i 行是 arr[i],直接赋值即可:std::array<int> row = arr[i];</int>(深拷贝,安全)
std::vector<:vector>> arr;</:vector>:不能整体拷贝某“行”为原生数组,但可以:std::vector<int> row = arr[i]; // 拷贝构造</int>或
std::copy(arr[i].begin(), arr[i].end(), dst);
std::vector<:vector>></:vector> 做 memcpy —— 每行内存不连续,会出错真正容易被忽略的是:原生二维数组的“行”不是独立对象,它没有类型信息;复制前必须显式确认列数 N,且该值不能靠 sizeof 在函数内推导(传参后退化为指针)。所以封装时建议把 N 作为参数一起传,或者改用 std::array 避免裸数组。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











