2017-04-21 120 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); 

我還沒有與分配器很多的工作,我想我的初始化使用默認/空/零點在構造值緩衝,它似乎是上面提到的構造函數是使用boost :: circular_buffer去了解它的方式,但我不完全知道如何用boost構造函數。如果是一個普通的矢量我以爲我可以做到以下幾點:

int num_elements = 10; 
Custom<T> custom; 
std::vector<Custom<T>> buffer(10, custom); 

我真的無法找到任何的例子明確,所以任何幫助或指導表示讚賞。

回答

2

就像你的std::vector調用你沒有指定分配器爲Custom並使用默認值,你可以用boost::circular_buffer做同樣的事情。唯一的區別是boost::circular_buffer有一個額外的參數可以讓你設置在同一時間的能力,並在緩衝區中默認的構造的對象的數量。這意味着,如果你想有一個完整的boost::circular_buffer那麼你可以使用:

int num_elements = 10; 
Custom<T> custom; 
boost::circular_buffer<Custom<T>> buffer(num_elements, num_elements, custom); 

給你一個boost::circular_buffer與它num_elements默認分配的對象的容量爲num_elements

你也可以有:

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

使容量來num_elements但僅填充一半,默認分配的對象緩存(num_elements/2)。

真的,你將不得不使用不同的分配的唯一原因是,如果你想分配器使用不同的分配方案(它是如何在實際系​​統中分配內存),比默認。

+0

確定這是偉大的。問題:現在當我推回來時,它將在最後開始填充,因爲所有項目都已填充,並且我的大小將返回num_elements。有沒有辦法解決?基本上我想要默認值,所以無論何時我訪問尚未填充但仍在容量範圍內的buffer [index],它都不會出錯。但我有點想要空的緩衝區的行爲,其中大小隻返回我特意推回的項目,當我明確推回時它將從頭開始(忽略默認值)。不確定這是否可能,可能必須重載一些操作符/方法? –

+0

@arias_JC就像一個矢量它是一個或另一個。你可以默認填充它,並用'operator []'覆蓋它,或者你設置它的容量,並用'push_back()'填充它。你可以在你自己的類中包裝緩衝區,並提供你想要的功能,如果你真的必須擁有它。 – NathanOliver