固定大小的容器,其中旧元素将被删除

时间:2014-05-23 16:07:27

标签: c++ std poco

标准 Poco 中是否有容器适配器允许指定它的大小以及我可以推送元素的位置,如果它将是全新元素将是添加代替旧版本(或将在末尾添加,但第一个元素将被删除,所有其余元素将在一个位置上移动)。

例如,想象一下size = 3的容器。

我将4个元素[1,2,3,4]分别推入其中,因此我得到了[2,3,4]或[4,2,3]的容器。

2 个答案:

答案 0 :(得分:2)

您正在寻找的结构称为循环缓冲区。 C ++没有提供代表这种结构的容器,但是当你使用vector作为底层容器时,它可以非常容易地编写。

为了了解如何实际实现它,您可以查看here,其中OP询问类似的结构,但是在bool上运行。您和他的问题之间的唯一区别是您实际上需要一个模板化类,所以它看起来像这样:

template <typename T>
class circularBuffer {
   vector<T> data;
   unsigned int lastEntryPos;

   // methods to access "data"
};

您还可以添加第二个模板参数,指示底层矢量的大小,并在构造函数中设置它:

template <typename T, size_type size>
class circularBuffer {
   // ...
   circularBuffer(): data(size), lastEntryPos(0){};
};

答案 1 :(得分:1)

你可以使用容器listvector,然后在插入元素之前,检查容器的大小,如果遇到count,则弹出旧元素,然后推送新元素。
每次,您都可以按相反的顺序迭代列表,以获取元素作为其插入序列。

#include <iostream>
#include <string>
#include <list>

using namespace std;

int main()
{
    list<int> q;
    for(int m = 0; m < 10; m++)
    {
        if(q.size() < 3)
            q.push_front(m);
        else
        {
            q.pop_back();
            q.push_front(m);
        }
    }

    for(auto x = q.rbegin(); x != q.rend(); x++)
        std::cout << *x;

    return 0;
}

输出789