如何减少C++二维vector初始化耗时?可替换为数组等容器
优化二维容器初始化耗时的几种方式
- 用一维vector替代嵌套二维vector
嵌套vector的问题在于要做11次内存分配(外层1次,内层10个小vector各1次),换成一维vector只需要1次连续内存分配,初始化速度会快很多。
代码示例:
// 直接创建10*2的一维vector,总元素数20 std::vector<double> x_vec(10 * 2); // 访问第i行第j列的元素时,用下标计算:i*2 + j x_vec[i*2 + j] = 3.14;
- 复用容器,别每次都新建
如果函数需要多次调用,别每次都创建新容器。可以把容器作为引用参数传入函数,或者用静态变量(注意多线程场景要加锁),也可以把容器设为类的成员变量。每次调用时只需要重置元素值,不需要重新分配内存:
void process_data(std::vector<std::vector<double>>& x_vec) { // 先确保容器尺寸符合要求,不够就扩容,够的话直接重置元素 x_vec.resize(10); for (auto& row : x_vec) { row.assign(2, 0.0); // 或者resize(2)后清空,按需选择 } // 接下来执行赋值操作 }
这种方式避免了重复的内存分配与释放,能大幅降低初始化耗时。
- 用静态数组或std::array(尺寸固定时)
如果10行2列的尺寸是编译期固定的,直接用栈上的静态数组或者std::array,完全不需要动态内存分配,初始化耗时几乎可以忽略:
// 栈上原生数组,不需要零初始化的话直接声明,速度最快 double x_arr[10][2]; // 或者用std::array,类型更安全,支持STL操作 std::array<std::array<double, 2>, 10> x_arr;
如果不需要零初始化,甚至连元素初始化的开销都能省掉,比vector快几个数量级。
- 自定义连续内存的二维容器
如果需要保留动态调整尺寸的灵活性,又想避免嵌套vector的开销,可以自己封装一个基于一维vector的二维容器,只做一次内存分配:
class TwoDArray { private: std::vector<double> data; int rows; int cols; public: TwoDArray(int r, int c) : rows(r), cols(c), data(r * c) {} // 重载()运算符,提供二维访问接口 double& operator()(int i, int j) { return data[i * cols + j]; } const double& operator()(int i, int j) const { return data[i * cols + j]; } }; // 使用示例 TwoDArray x_arr(10, 2); x_arr(3, 1) = 2.718;
这种方式兼顾了动态性和初始化效率,比嵌套vector快很多。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

