2011-04-05 87 views
6

我有一個消費應用程序,它需要在列表中存儲最多100個對象,以供給回調進行處理,因爲如果消費者沒有趕上,那麼保留舊數據將是多餘的。隨着新數據的到來,它可以簡單地覆蓋最舊的元素。哪個STL C++容器用於固定大小的列表?

我正在考慮使用循環緩衝區容器,並猜測它會是deque,但發現它不使用循環列表,也沒有選項來設置固定的最大大小。

在出列中有一個max_size方法,但文檔中提到「由於系統或庫實現的限制,這是容器可以達到的最大潛在大小。」

是否有其他容器可以使用?

PS:我使用Visual C++ 2010速成

回答

15

沒有標準庫容器已經做了你直接想要的東西。但是,你應該看看Boost's Circular Buffer Container。如果你不能使用Boost,你至少可以查看它的源代碼並重做它。

+1

-1,問題詢問STL – ThomasMcLeod 2011-04-06 00:12:21

+19

@Thomas:我明確表示沒有任何東西,並提出了一個替代方案。你更喜歡什麼,根本沒有答案? – GManNickG 2011-04-06 00:14:34

+1

@格曼,沒有打算犯罪。我認爲在存在相當簡單的基於STL的解決方案時提及Boost是不恰當的。由於各種原因,Boost不適合某些人。 – ThomasMcLeod 2011-04-06 00:35:19

3

爲什麼不直接使用矢量與每次添加一個新的對象時增加MOD 100的指數?

#define NUM_ELTS 100 
    template < typename T > 
    class CircularVector 
    { 
    public: 
     CircularVector() : idx(0) 
     { 
      vec = vector<T>(NUM_ELTS); 
     } 
     void push_back(T& elt) 
     { 
      vec[ idx++ % NUM_ELTS ] = elt; 
     } 
    private: 
     int idx; 
     vector<T> vec; 
    }; 

反正這樣的事情。

-2

我通常會用鏈表(我猜它會是「list」stl容器)滾動我自己的循環緩衝區。除非你需要大量的隨機訪問元素,否則這種方法運行良好。你可以編寫一個包含鏈接列表的類並自己維護大小(如果大小>閾值{移除前面的元素},則在後面添加元素)。您也可以通過維護和包裝頭部和尾部索引來製作具有普通陣列/矢量的循環緩衝區,但使用GMan提到的增強效果可能會更好。

+1

爲什麼要在連續數組上使用鏈表?鏈接列表的缺點是分配器負載,內存開銷和碎片(緩存未命中)。上行可能會稍微容易一些。 – 2014-12-15 11:26:35