0

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

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

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

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

所以,我可能想写一个类,它有一个类似双端队列的接口,底层是一个向量和一个双端队列,使用向量直到(比如说)存在 16 个元素,之后向量被丢弃并使用双端队列从那里开始。

由于向量仅在只有少量元素时使用,所以 push_front() 和 pop_front() 在速度方面效率低下并不重要,因为我可以控制向量容量()和保留(),当存在更多元素时,双端队列使用大量内存并不重要。

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

提前致谢。

4

2 回答 2

2

您没有提及是否需要随机访问迭代器的其他功能vector或类似的功能。deque如果你不这样做,这听起来确实是一个不错的选择list。具有良好的两端插拔性能。

于 2011-01-14T17:48:02.927 回答
2

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

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

于 2011-01-14T17:54:45.163 回答