我有一个消费应用程序需要在列表中存储最多100个对象以提供给回调进行处理,因为如果消费者没有赶上,保留旧数据将是多余的。当新数据到达时,它可以简单地覆盖最旧的元素。
我正在考虑使用循环缓冲容器并猜测它将是deque,但发现它不使用循环列表,以及没有选项来设置固定的最大大小。
出队时有一个max_size方法,但文档说“由于系统或库实现限制,这是容器可以达到的最大可能大小。”
我可以使用其他容器吗?
PS:我使用的是Visual C ++ 2010 express
答案 0 :(得分:15)
没有标准的库容器可以直接执行您想要的操作。但是,您应该看看Boost's Circular Buffer Container。如果你不能使用Boost,你至少可以查看它的来源并重做它。
答案 1 :(得分:12)
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提到的提升可能会更好。