2012-02-27 96 views
0

我有一个项目在c + + 03有一个problem与数据结构:我使用矢量而不是列表,即使我不得不连续pop_front-push_back。但现在可以,因为我现在需要重写太多的代码。弹出式元素从std :: vector和重用元素

我的做法是tu有一个最后frame_size点的缓冲区始终更新。所以每一帧我都要弹出并推回去。 (mayebe有这种方法的名称?)

,所以我用这个代码:

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

好吧,这不是很有用,也许它没有任何意义,但我只问教育的好奇心:我该怎么做?

如何可以存储矢量的擦除元件的存储器用于重复使用它?这个问题有意义吗?如果不是,为什么?

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

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

+2

如果你持续使用'pop_front',而不想使用'list',那为什么不使用'std :: deque'? – 2012-02-27 11:08:56

+0

问题是我有很多使用std :: vector的实用程序,所以我需要打开实用程序的存储库,将它分叉,然后模板(或重写)所有采用向量来使其可用于列表或Deque的所有内容 – nkint 2012-02-27 11:11:40

+0

Point重量的创造?您正在存储对象,而不是指向向量中的对象的指针。如果要将对象保存在池中,最好将它们存储为指针而不是对象。 – Jagannath 2012-02-27 11:19:57

回答

2

我有一些随时可以使用的代码对象池......我该怎么做?

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

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

该矢量已经做到了。您致电erase会将所有元素向下移动到第一个元素腾出的空间中,在末尾留出空白区域以将新元素推入。

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

1

我不知道理解你想做的事,但是这应该是functionnally相当于你写的东西,没有构建临时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; 

编辑:麦克西摩在评论中指出,这个解决方案和问题中提出的方法都不会导致任何新的内存分配。

+0

最后2条语句应该在if条件中吗? – Jagannath 2012-02-27 11:28:51

+0

只要删除if条件,应该想要@nkint想要的。 – Jagannath 2012-02-27 11:33:34

+0

@Jagannath @两种方式应该是等价的,但你是对的:你的优雅和紧凑。 – Francesco 2012-02-27 11:36:33

相关问题