std::vector 在内部包含给定类型的连续内存缓冲区,布尔值除外。无论如何都可以通过指定此缓冲区来构造向量,从而不需要处理数据?
我有一个 C api,它为我提供了某种类型的数据缓冲区。我希望能够通过与 std::vector 相关的功能来操作这些数据,例如 std::vector<>::iterator、begin()、end() 等。
也许您对我如何使用这些缓冲区有更好的建议,因为它们很大,我不想复制它们。
api 分配内存并提供一个函数,我调用它来告诉它再次释放它。
std::vector 在内部包含给定类型的连续内存缓冲区,布尔值除外。无论如何都可以通过指定此缓冲区来构造向量,从而不需要处理数据?
我有一个 C api,它为我提供了某种类型的数据缓冲区。我希望能够通过与 std::vector 相关的功能来操作这些数据,例如 std::vector<>::iterator、begin()、end() 等。
也许您对我如何使用这些缓冲区有更好的建议,因为它们很大,我不想复制它们。
api 分配内存并提供一个函数,我调用它来告诉它再次释放它。
为什么不将缓冲区包装在一个包含您希望能够使用的功能的简单类中。使用指针是迭代器这一事实,这样的事情可能就足够了。
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() );
如果您还想管理缓冲区包含的内存,那么您需要添加一个析构函数并删除默认的复制构造函数和赋值运算符。