2012-10-22 148 views
0

据我所知,deque是一个循环缓冲区,当空间用完时,它会分配新的空间(如果它可以)。有没有办法限制deque可以增长到? 或者确保它不会超过最大大小的唯一方法是检查每次我想要插入数据到deque?将deque max_size设置为最大尺寸

回答

2

是的,与每个STL集合一样,其中一个模板化参数是分配器。

因此,即使内存可用,如果超出此限制,您可以编写自己的自定义分配程序来跟踪内存,并抛出bad_alloc

顺便提一句,std::deque通常实现为“页面”的集合,其中每个页面包含固定数量的元素。

如果你想有一个循环缓冲器实现,可以插入或删除“任何地方”,std::deque不会是最有效的使用,std::list将是(虽然有提升,你可以利用现有的圆形集合)。

+0

一个cutsom分配器似乎是错误的方法解决这个问题。我知道,在为双端队列请求的内存量和双端队列的大小之间没有严格的关系。例如,矢量的大小和容量之间肯定没有这种关系。 – john

+0

您可能指的是deque实现本身和分配器之间的关系,以及哪一个选择页面大小,因此您不能保证完美调整它,但是由于限制可能基于您想要的最大内存分配考虑到这个对象,你的分配器将能够管理它,尽管你可能会发现你实际上无法准确达到阈值。 – CashCow

1

deque不是循环缓冲区;它通常作为链接的数组集合来实现。对于循环缓冲区,请参阅Boost中的circular_buffer

0

一个deque不是一个循环缓冲区。它可以实现为循环缓冲区,但实现细节对用户是隐藏的。我建议你编写一个包装类或便利函数来为你做大小检查。

1

由于我的经验最简单的方法是通过一个包装类封装的双端队列,写了两个成员函数包装push_backpush_front