2017-04-21 7 views
0

とアロケータおよび初期化子を使用して:: 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); 

私は本当に、特にこの上の任意の例を見つけることができませんでしたので、任意の助けや指導が理解されます。

答えて

2

std::vectorコールのように、Customのアロケータを指定せずにデフォルトを使用する場合は、boost::circular_bufferと同じことを実行できます。唯一の相違点は、boost::circular_bufferに追加のパラメータがあることです。同時に、バッファにデフォルトで構築されたオブジェクトの容量と数を設定できます。

それで num_elementsデフォルト割り当てられたオブジェクトを num_elementsの容量を持つあなたに boost::circular_bufferを与える
int num_elements = 10; 
Custom<T> custom; 
boost::circular_buffer<Custom<T>> buffer(num_elements, num_elements, custom); 

を:それはあなたが完全なboost::circular_bufferをしたい場合は、あなたが使用することを意味します。

またかもしれない:

boost::circular_buffer<Custom<T>> buffer(num_elements, num_elements/2, custom); 

num_elementsに容量を設定しますが、唯一のデフォルト割り当てられたオブジェクトで半分バッファ(num_elements/2)を充填します。

本当に別のアロケータを使用する唯一の理由は、アロケータが異なる割り当て方式(実際にシステム内のメモリをどのように割り当てるか)をデフォルトよりも使いたい場合です。

+0

これは素晴らしいです。質問:私はすべての項目が満たされているので、最後に入力を開始します。私のサイズはnum_elementsを返します。これを回避する方法はありますか?基本的には、まだ値が設定されていなかったバッファ[index]にアクセスするたびに容量の範囲内に入ると、デフォルト値が必要になりました。しかし、私は空のバッファの動作を望んでいました。サイズが返ってきた項目だけが返されていました。私が明示的にプッシュバックした項目は、最初から始まります(デフォルトは無視されます)。それが可能でも、いくつかの演算子/メソッドをオーバーロードしなければならないかどうかわからないのですか? –

+0

@arias_JCベクトルと同じように、どちらか一方です。デフォルトでそれを塗りつぶして 'operator []'でオーバーライドするか、またはその容量を設定し、 'push_back()'で埋めてください。自分のクラスにバッファをラップし、本当に必要な場合には、必要な機能を提供することができます。 – NathanOliver

関連する問題