我在c ++ 03中有一个项目,其中problem具有数据结构:即使我必须连续使用pop_front-push_back,我也会使用vector而不是list。但是现在还可以,因为我现在需要重写太多代码。
我的方法是tuo有一个缓冲区,最后一帧frame_size点总是更新。所以每一帧我必须弹出前面并向后推。 (可能有这种方法的名称?)
所以我使用这段代码:
Point apoint; // allocate new point
apoint.x = xx;
apoint.y = yy;
int size = points.size()
if (size > frame_size) {
this->points.erase( points.begin() ); // pop_front
}
this->points.push_back(apoint);
我有一些现成的对象池代码,所以我想:这不是一个很好的优化,但我可以将前端存储在池中,这样我就可以获得点的分配时间。
好吧这不是那么有用,可能没有意义,但我只是问教育的好奇心:我怎么能这样做?
如何存储矢量的已擦除元素的内存以便重复使用 ?这个问题有意义吗?如果没有,为什么?
..因为擦除不返回擦除的向量,它返回:
指向元素新位置的随机访问迭代器 在函数调用擦除的最后一个元素之后,即 如果操作擦除了最后一个元素,则向量结束 序列
答案 0 :(得分:2)
我有一些现成的对象池代码......我怎么能这样做?
使用矢量,你不能。向量将其元素存储在连续的数组中,因此不能一次分配一个,只能以任意大小的块分配。因此,您不能将对象池用作std::vector
的分配器。
如何存储矢量的擦除元素的内存以便重复使用?这个问题有意义吗?如果没有,为什么?
载体已经这样做了。您对erase
的调用会将所有元素向下移动到第一个元素腾出的空间中,在末尾留下一个空白区域以将新元素推入。
只要你使用矢量,你就不能避免在擦除第一个元素时移动所有元素;如果效率太低,请使用deque
(或可能是list
)。
答案 1 :(得分:1)
我不确定你想要做什么,但这应该在功能上等同于你所写的内容,而不构建一个临时的Point
实例:
// don't do this on an empty vector
assert (points.size() > 0);
// rotate elements in the vector, erasing the first element
// and duplicating the last one
copy (points.begin()+1, points.end(), points.begin());
// overwrite the last element with your new data
points.back().x = xx;
points.back().y = yy;
编辑:正如Mike Seymour在评论中指出的那样,这个解决方案和问题中提出的方法都不会导致任何新的内存分配。