高效初始化std :: vector

时间:2012-08-10 08:51:34

标签: c++

std :: vector在给定类型内部包含一个连续内存缓冲区,bools除外。无论如何通过指定这个缓冲区来构造一个向量,这样就不需要复制数据了吗?

我有一个C api,它为我提供了某种类型数据的缓冲区。我希望能够通过与std :: vector相关的功能来操作这些数据,例如std :: vector<> :: iterator,begin(),end()等。

也许您对如何使用这些缓冲区有更好的建议,因为它们很大,我不想复制它们。

api分配内存并提供一个函数,我打电话告诉它再次释放它。

1 个答案:

答案 0 :(得分:4)

为什么不将缓冲区包装在一个包含您希望能够使用的函数的简单类中。 使用指针是迭代器的事实,这样的事情可能就足够了。

template<typename T>
struct RawBuffer<T>
{
  RawBuffer( T* in_buffer, size_t in_n ) : buffer(in_buffer), n(in_n) {}
  T* buffer;
  size_t n;
  T* begin() { return buffer; }
  T* end() { return buffer+n; }
  const T* begin() const { return buffer; }
  cont T* end() const { return buffer+n; }
  T& operator[](size_t i) { return buffer[i]; }
  const T& operator[](size_t i) const { return buffer[i]; }
};

现在你可以使用它有点像矢量:

RawBuffer<MyObject> values( generate_objects(n), n );

//Set an entry
values[1] = MyObject()

//Or use an entry
values[1].do_something();

//Lets use some std functions on the object.
std::for_each( values.begin(), values.end(), my_object_fn );

//Or create a real vector from it
std::vector<MyObject> values_copy( values.begin(), values.end() );

如果您还想管理缓冲区包含的内存,则需要添加destrtuctor并删除默认的复制构造函数和赋值运算符。