来自std :: vector的pop-push元素和重用元素

时间:2012-02-27 10:37:02

标签: c++ vector std erase object-pooling

我在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);

我有一些现成的对象池代码,所以我想:这不是一个很好的优化,但我可以将前端存储在池中,这样我就可以获得点的分配时间。

好吧这不是那么有用,可能没有意义,但我只是问教育的好奇心:我怎么能这样做?

如何存储矢量的已擦除元素的内存以便重复使用 ?这个问题有意义吗?如果没有,为什么?

..因为擦除不返回擦除的向量,它返回:

  

指向元素新位置的随机访问迭代器   在函数调用擦除的最后一个元素之后,即   如果操作擦除了最后一个元素,则向量结束   序列

2 个答案:

答案 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在评论中指出的那样,这个解决方案和问题中提出的方法都不会导致任何新的内存分配。