如何在C++中将二维顶点数组转换为一维xy值数组
C++ 二维数组展平为一维数组实现方案
下面分两种常见的使用场景给出可直接运行的稳定实现:
场景1:原生固定大小二维数组
如果你的二维数组是编译期就确定行列数的原生数组,可以直接通过双层遍历实现:
#include <iostream> #include <vector> int main() { // 示例3行2列二维数组 int two_dim[3][2] = {{1,2}, {3,4}, {5,6}}; const int rows = 3; const int cols = 2; // 提前分配好一维数组空间,大小为行数*列数 int one_dim[rows * cols]; // 也可以用vector做动态存储:std::vector<int> one_dim; one_dim.reserve(rows*cols); for(int i = 0; i < rows; i++) { for(int j = 0; j < cols; j++) { // 按行优先顺序填充一维数组,也就是你需要的[x,y,a,b,z,e]顺序 one_dim[i * cols + j] = two_dim[i][j]; // 如果用vector的话写成 one_dim.push_back(two_dim[i][j]); } } // 测试输出 for(int num : one_dim) { std::cout << num << " "; } return 0; }
运行输出为 1 2 3 4 5 6,完全符合你需要的格式。
场景2:vector嵌套实现的动态二维数组
如果你的二维数组是运行时才确定大小,用std::vector<std::vector<T>>存储的,实现逻辑和上面一致,同时兼容不同子数组长度的情况:
#include <iostream> #include <vector> int main() { std::vector<std::vector<int>> two_dim = {{1,2}, {3,4}, {5,6}}; std::vector<int> one_dim; // 提前预分配空间提升性能 size_t total_size = 0; for(auto &sub_arr : two_dim) { total_size += sub_arr.size(); } one_dim.reserve(total_size); for(auto &sub_arr : two_dim) { // 直接将子数组的所有元素追加到一维数组末尾,不需要手动写内层索引遍历 one_dim.insert(one_dim.end(), sub_arr.begin(), sub_arr.end()); } // 测试输出 for(int num : one_dim) { std::cout << num << " "; } return 0; }
这个实现即使子数组长度不一致也不会出错,稳定性更强。
注意事项
- 如果你需要的是按列优先展平(比如输出
1,3,5,2,4,6),只需要把双层遍历的顺序调换,先遍历列再遍历行即可 - 访问数组元素前确认索引没有超过行列边界,避免出现内存越界错误
内容的提问来源于stack exchange,提问作者Farouk
相关产品推荐
相关产品推荐

