0

我在 c++03 中有一个项目存在数据结构问题:即使我必须不断地 pop_front-push_back,我也使用向量而不是列表。但是现在还可以,因为我现在需要重写太多代码。

我的方法是总是更新最后一个 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);

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

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

如何存储向量的已擦除元素的内存以重用它?这个问题有意义吗?如果不是,为什么?

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

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

4

2 回答 2

2

我有一些现成的对象池代码......我该怎么做?

使用矢量,你不能。向量将其元素存储在一个连续的数组中,因此不能一次分配一个,只能分配任意大小的块。因此,您不能将对象池用作std::vector.

如何存储向量的已擦除元素的内存以重用它?这个问题有意义吗?如果不是,为什么?

向量已经这样做了。您的调用erase将所有元素向下移动到第一个元素腾出的空间中,最后留下一个空白空间以将新元素推入。

只要你使用一个向量,你就无法避免在擦除第一个时移动所有元素;如果那效率太低,请改用 a deque(或可能 a list)。

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

于 2012-02-27T11:24:17.260 回答