2011-04-05 88 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