2

std :: vectorには、boolを除いて、特定のタイプの連続メモリのバッファが内部に含まれています。データの対処が不要になるようにこのバッファを指定してベクトルを作成する方法はありますか?

特定のタイプのデータのバッファーを提供するCapiがあります。std :: vector <> :: iterator、begin()、end()など、std::vectorに関連付けられた機能を介してこのデータを操作できるようにしたいと思います。

これらのバッファは巨大であり、コピーしたくないので、これらのバッファをどのように使用するかについて、より良い提案があるかもしれません。

APIはメモリを割り当て、それを再度解放するように指示するために呼び出す関数を提供します。

4

1 に答える 1

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

バッファに含まれるメモリも管理したい場合は、デストラクタを追加し、デフォルトのコピー コンストラクタと代入演算子を削除する必要があります。

于 2012-08-10T09:09:49.103 に答える