像大量物品的双端队列,但小号码的内存使用量少?

时间:2011-01-14 17:13:34

标签: c++ memory-management stl vector deque

我有一大堆特定类型的对象,每个对象都可以分配一个双端队列来保存相同类型的其他对象。我正在使用双端队列,因为我需要在两端快速访问,因为任何特定的对象都可能引用许多其他对象。

然而,很可能是很多甚至大多数对象引用很少的其他对象。在这种情况下,deque的内存使用量非常大。我正在使用的实现是一次性分配4096个字节,只要我第一次执行push_back()。双端队列中的每个元素只有8个字节。这是一大堆浪费的空间,特别是因为我制作了很多这些物品,因此很多都是这些物品。

同时,我几乎需要一个deque(或类似的东西),因为就像我说的,任何特定的对象实际上都可以引用许多其他对象,尽管事实上大多数对象引用很少的其他对象。

我的第一个想法是使用capacity()和reserve()来自己增加deque,但我的编译器告诉我,deque上没有这样的函数。

所以,我想或许要编写一个带有类似deque的接口的类,底层是vector和deque,使用向量直到(比如)存在16个元素,之后向量被抛弃并且deque从那里开始使用。

由于向量仅在只有少量元素的情况下使用,因此push_front()和pop_front()在速度方面效率低下并且因为我可以控制带有capacity()和reserve()的向量,当存在更多元素时,deque使用大量内存并不重要。

但是,在像这样滚动我自己的课之前,我想检查一下这样的东西是否已经存在。此外,如果有人知道任何原因我没有想到为什么这样的事情是个坏主意,或者如果有人有任何相关的建议,我很乐意听到。

提前致谢。

2 个答案:

答案 0 :(得分:2)

您没有提及是否需要vectordeque的其他功能,例如随机访问迭代器。如果你不这样做,这实际上听起来像是使用list的好候选人。它具有良好的插拔和两端移除性能。

答案 1 :(得分:2)

如果您不需要按索引进行随机访问,则可以使用(侵入式)列表。列表允许快速O(1)push_front/push_back()pop_front/pop_back()

如果没有共享对象,也就是说,一个对象最多只拥有一个其他对象,那么侵入式列表将是最好的。由于您的对象属于同一类型,因此可以从一个内存池(大数组)中分配它们,以避免任何内存开销。