如何便宜地将C风格的数组分配给std :: vector?

时间:2011-04-29 19:09:51

标签: c++ arrays stl vector stdvector

目前我执行以下操作:

// float *c_array = new float[1024];

void Foo::foo(float *c_array, size_t c_array_size) {
  //std::vector<float> cpp_array;

  cpp_array.assign(c_array, c_array + c_array_size);
  delete [] c_array;
}

如何优化此分配?我不想执行元素复制,只是交换指针。

4 个答案:

答案 0 :(得分:21)

当前std::vector不提供任何功能或接口来获取先前分配的存储的所有权。据推测,偶然传递一个堆栈地址太容易了,比它解决的问题还要多。

如果你想避免复制到矢量中,你需要在整个调用链中使用矢量,或者在整个时间内使用float[]的C方式。你不能混合它们。您可以保证&vec[0]将等同于C阵列,但完全连续,因此在整个程序中使用向量可能是可行的。

答案 1 :(得分:6)

目前,std::vector界面不具备从另一个std::vector移动或与之交换的能力。

答案 2 :(得分:4)

唯一的方法是创建自定义分配器。

  1. 编写一个可以用数组初始化的分配器类。

  2. 以分配器作为参数实例化向量。

答案 3 :(得分:1)

不太可能 - 它很危险,因为std :: vector不知道如何分配内存以及如何释放内存。

如果可能,您可以使用正确大小的std :: vector替换原始分配。它使用连续的内存区域,因此可以替换手动分配的缓冲区。