我尝试获取某种仅包含最后n个元素的缓冲区。因此,如果新值到达,则忘记缓冲区中的最后一个。到目前为止我所做的是:
vector<double> buf;
buf.assign(n,0);
while(1) {
memcpy(&buf[1],&buf[0],sizeof(double)*(n-1));
buf[0] = SomeNewDouble;
}
我不知道这是多么的执行。有更好的方法吗?
限制:
操作系统:Linux使用gcc / g ++(
答案 0 :(得分:2)
我认为这是一个更清洁,更好的实施:
buf.pop_back();
buf.insert(buf.begin(), newVal);
如果您对性能表示不满,并且进行了比(随机)访问操作更多的修改,则可以使用(链接)std::list
代替:
std::list<double> list;
list.pop_back();
list.push_front(newVal);
std::list::pop_back()
和std::list::push_front()
都是及时的(O(1)
)。
答案 1 :(得分:0)
您应该使用已经模拟所需FIFO行为的std::queue
。
const int n; // your n
std::queue<double> buffer;
for (int i = 0; i < n; ++i) // initialize with n zeros
buffer.push(0);
while (true) {
buffer.pop(); // forget last one
buffer.push(SomeNewDouble); // push new one
}