【问题标题】:Efficient initialization of a std::vector高效初始化STD :: Vector
【发布时间】:2012-08-07 13:22:03
【问题描述】:

一个 std::vector 在内部包含一个给定类型的连续内存缓冲区,布尔值除外。有没有办法通过指定这个缓冲区来构造一个向量,这样就不需要处理数据了?

我有一个 C api,它给我一个特定类型的数据缓冲区。我希望能够通过与 std::vector 相关的功能来操作这些数据,例如 std::vector::iterator、begin()、end() 等。

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

api 分配内存并提供一个函数,我调用它来告诉它再次释放它。

【问题讨论】:

  • 也许你不知道,但指针是迭代器。
  • 您是否将缓冲区提供给 C API 进行填充,还是为其分配内存并将其返回给您?
  • @JohnB 它分配内存并提供一个函数,我调用它告诉它再次释放它。
  • 好的,所以你不能制作一个向量然后给它内存。只是一个想法

标签: c++


【解决方案1】:

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

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() );

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

【讨论】:

  • 而包装这个的原因是......?他还不如直接使用buffer[i], &buffer[0]`和&amp;buffer[0] + n
  • @Xeo - 虽然我同意通常直接使用缓冲区是合适的,但有很多理由不这样做。可能有他想要的其他向量成员使用纯迭代器来表达并不那么简单。他可能需要在需要某些成员函数的模板化方法中使用该对象。他可能不想与缓冲区分开跟踪n。您可能希望确保正确处理它。
  • 这正是我要做的,只是比我的答案写得更好,我会稍微删除它以避免在没有其他信息的情况下重复...您还可以使用该类来处理通过析构函数释放数据,这又是一个很好的理由。
猜你喜欢
  • 2013-06-06
  • 2013-07-13
  • 2012-06-09
  • 1970-01-01
  • 2019-01-16
  • 2012-12-18
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多