c++ - std::vector 的高效初始化

标签 c++

std::vector 内部包含给定类型的连续内存缓冲区( bool 值除外)。无论如何,是否可以通过指定此缓冲区来构造 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]; }
};

现在你可以像 vector 一样使用它:

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

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

关于c++ - std::vector 的高效初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11898297/

相关文章:

c++ - 我如何为 Windows 构建 jcal?

c++ - C++20 中的 std::launder 用例

c++ - 不带 'GetString()' 的 CString 到 std::string 的转换

c++ - do while 和 switch 错误

c++ - 动态添加到图形数据结构

c++ - 有没有更多有用的仿函数用例?

c++ - 有序双链表

c++ - 三角形中的矩形

iphone - 在 iPhone 上调试一个模糊的错误

c++ - 允许通过子集的迭代和随机选择进行更改的数据结构 (C++)