标准或 Poco 中是否有容器适配器允许指定它的大小以及我可以推送元素的位置,如果它将是全新元素将是添加代替旧版本(或将在末尾添加,但第一个元素将被删除,所有其余元素将在一个位置上移动)。
例如,想象一下size = 3的容器。
我将4个元素[1,2,3,4]分别推入其中,因此我得到了[2,3,4]或[4,2,3]的容器。
答案 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)
你可以使用容器list
或vector
,然后在插入元素之前,检查容器的大小,如果遇到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