とアロケータおよび初期化子を使用して:: circular_buffer:C++私はブーストのために次のコンストラクタを使用する方法を把握しようとしていますブースト循環バッファ
circular_buffer(capacity_type buffer_capacity, size_type n, const_reference item, const allocator_type& alloc = allocator_type());
私はカスタムクラスを持っている:
template<class T> class Custom
{
public:
Custom() :
time(0.0)
{}
double time;
T data_;
};
私の循環バッファは、単に容量を取ってコンストラクタを使って定義されています:
boost::circular_buffer<Custom<T>> buffer(10);
私はしていませんallocatorを使って多くの作業をしましたが、構築時にバッファをデフォルト/空/ゼロの値で初期化したいのですが、上記のコンストラクタがboost :: circular_bufferを使って行く方法ですが、ブーストコンストラクタを使用します。それは私が、私は次の操作を行うことができます仮定普通のベクトルた場合:
int num_elements = 10;
Custom<T> custom;
std::vector<Custom<T>> buffer(10, custom);
私は本当に、特にこの上の任意の例を見つけることができませんでしたので、任意の助けや指導が理解されます。
これは素晴らしいです。質問:私はすべての項目が満たされているので、最後に入力を開始します。私のサイズはnum_elementsを返します。これを回避する方法はありますか?基本的には、まだ値が設定されていなかったバッファ[index]にアクセスするたびに容量の範囲内に入ると、デフォルト値が必要になりました。しかし、私は空のバッファの動作を望んでいました。サイズが返ってきた項目だけが返されていました。私が明示的にプッシュバックした項目は、最初から始まります(デフォルトは無視されます)。それが可能でも、いくつかの演算子/メソッドをオーバーロードしなければならないかどうかわからないのですか? –
@arias_JCベクトルと同じように、どちらか一方です。デフォルトでそれを塗りつぶして 'operator []'でオーバーライドするか、またはその容量を設定し、 'push_back()'で埋めてください。自分のクラスにバッファをラップし、本当に必要な場合には、必要な機能を提供することができます。 – NathanOliver