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

pop-push element from std::vector and reuse elements

本文关键字:元素 pop-push vector 中的 std      更新时间:2023-10-16

我在c++03中有一个项目的数据结构有问题:即使我必须连续pop_front-push_back,我也使用vector而不是list。但现在还可以,因为我现在需要重写太多的代码。

我的方法是too总是更新最后一帧大小点的缓冲区。所以每一帧我都必须向前弹出,然后向后推。(这种方法有名字吗?)

所以我使用这个代码:

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的分配时间。

好吧,这没那么有用,可能也没什么意义,但我只是出于对教育的好奇而问:我怎么能做到这一点?

如何存储向量的已擦除元素的内存以供重用?这个问题有道理吗?如果没有,为什么?

因为擦除不会返回已擦除的矢量,所以它返回:

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

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

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

如何存储向量中已擦除元素的内存以供重用?这个问题有道理吗?如果没有,为什么?

矢量已经做到了。对erase的调用将所有元素向下移动到第一个元素空出的空间中,在末尾留下一个空白空间来将新元素推入。

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

我不确定是否理解您想要做什么,但这在功能上应该与您所写的内容等效,而无需构建临时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在评论中指出的,这个解决方案和问题中提出的方法都不会导致任何新的内存分配。