Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 仅包含最后n个元素的向量_C++_Vector - Fatal编程技术网

C++ 仅包含最后n个元素的向量

C++ 仅包含最后n个元素的向量,c++,vector,C++,Vector,我试图得到某种只包含最后n个元素的缓冲区。因此,如果新值到达,请忘记缓冲区中的最后一个值。到目前为止,我所做的是: vector<double> buf; buf.assign(n,0); while(1) { memcpy(&buf[1],&buf[0],sizeof(double)*(n-1)); buf[0] = SomeNewDouble; } vectorbuf; 分配(n,0); 而(1){ memcpy(&buf[1],&buf[0],siz

我试图得到某种只包含最后n个元素的缓冲区。因此,如果新值到达,请忘记缓冲区中的最后一个值。到目前为止,我所做的是:

vector<double> buf;
buf.assign(n,0);

while(1) {
  memcpy(&buf[1],&buf[0],sizeof(double)*(n-1));
  buf[0] = SomeNewDouble;
}
vectorbuf;
分配(n,0);
而(1){
memcpy(&buf[1],&buf[0],sizeof(double)*(n-1));
buf[0]=SomeNewDouble;
}
但我不知道这有多好。有更好的方法吗

限制:

  • 它必须是一个向量

OS:Linux使用gcc/g++(

我认为这是一个更干净、更好的实现:

buf.pop_back();
buf.insert(buf.begin(), newVal);
如果您关心性能,并且所做的修改多于(随机)访问操作,则可以使用(链接的)
std::list

std::list<double> list;
list.pop_back();
list.push_front(newVal);
std::list;
list.pop_back();
列表。向前推(newVal);
std::list::pop_back()
std::list::push_front()
都是时间常数(
O(1)
)。

您应该使用已经模拟了所需FIFO行为的

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
}
const int n;//您的n
std::队列缓冲区;
对于(int i=0;i
谢谢你的回答。我必须使用vector's。pop_back是否没有收缩向量,然后再插入增加它的大小?@magu_是的,它改变了向量的
大小,但没有改变
容量,这意味着没有进行重新分配,因此我在
插入()之前写了
pop_back()
。注意,
insert()
必须重新定位元素(就像您在memcpy调用中已经做的那样),这意味着复杂性是
O(n)
用于此调用。它归结为相同的性能,但阅读起来更简洁。啊,是的,我忘记了大小和容量之间的差异。谢谢你的回答,因为你删除了另一个线程上的一篇文章,我认为我被不公平地否决了。你在这里得到了+1。我仍然需要向量中的随机访问,所以队列可能不会被删除方法是这样的。而且它还需要使用vector来完成,不幸的是,使用memcpy时,源和目标不应该重叠。使用memmove代替。