哪个STL C ++容器用于固定大小的列表?

时间:2011-04-05 23:22:50

标签: c++ stl

我有一个消费应用程序需要在列表中存储最多100个对象以提供给回调进行处理,因为如果消费者没有赶上,保留旧数据将是多余的。当新数据到达时,它可以简单地覆盖最旧的元素。

我正在考虑使用循环缓冲容器并猜测它将是deque,但发现它不使用循环列表,以及没有选项来设置固定的最大大小。

出队时有一个max_size方法,但文档说“由于系统或库实现限制,这是容器可以达到的最大可能大小。”

我可以使用其他容器吗?

PS:我使用的是Visual C ++ 2010 express

4 个答案:

答案 0 :(得分:15)

没有标准的库容器可以直接执行您想要的操作。但是,您应该看看Boost's Circular Buffer Container。如果你不能使用Boost,你至少可以查看它的来源并重做它。

答案 1 :(得分:12)

boost::circular_buffer。那就是

std::vector<T> vec(size);
vec[i % size] = newelem;

答案 2 :(得分:4)

为什么不在每次添加新对象时使用索引增加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;
    };

无论如何都是这样的。

答案 3 :(得分:-2)

我通常使用链接列表滚动自己的循环缓冲区(我猜它将是“list”stl容器)。除非您需要大量随机访问元素,否则这种方法很有效。您可以编写一个包含链接列表的类并自己维护大小(如果大小&gt;阈值{删除前面的元素}等,请在后面添加元素)。您还可以通过维护和包装头部和尾部索引来制作具有正常数组/向量的循环缓冲区,但是使用GMan提到的提升可能会更好。