标准STL向量容器具有“保留”功能,用于保留未初始化的内存,以后可用于防止重新分配。
为什么另一个deque容器没有呢?
答案 0 :(得分:11)
增加std::vector
的大小可能代价高昂。当vector
超出其保留空间时,必须将向量的全部内容复制(或移动)到更大的保留空间。
具体是因为频繁std::vector
调整大小可能代价高昂 vector::reserve()
存在。
相反,deque
总是可以添加更多内存,而无需重新定位现有元素。
答案 1 :(得分:6)
对于vector
和string
,保留空间通过确保不需要复制元素来防止以后插入(直到容量)使迭代器和对早期元素的引用无效/移动。这种搬迁也可能代价高昂。
对于deque
和list
,先前的引用永远不会被插入无效,并且元素不会移动,因此不会出现保留容量的需要。
您可能认为使用vector
和string
,保留空间也可以保证以后的插入不会抛出异常(除非构造函数抛出),因为不需要分配内存。您可能认为相同的保证对其他序列有用,因此deque::reserve
可能会有用。 vector
和string
实际上没有这样的保证,尽管在大多数(所有?)实现中都是如此。所以这不是reserve
的预期目的。
答案 2 :(得分:3)
与std :: vector相反,双端队列的元素不是连续存储的:典型的实现使用一系列单独分配的固定大小的数组。
双端队列的存储会根据需要自动扩展和收缩。 扩展deque比std :: vector的扩展便宜,因为它不涉及将现有元素复制到新的内存位置。
Deque可以在任何想要的位置分配新内存,只需指向它,不像需要连续内存块来保存所有元素的向量。
答案 3 :(得分:1)
只有vector
。 deque不需要保留函数,因为元素没有连续存储,并且在添加或删除元素时无需重新分配和移动元素。
答案 4 :(得分:1)
reserve意味着分配大块连续数据(如矢量)。在dequeue中没有任何东西暗示连续存储 - 它通常更像是一个列表(你会注意到它也没有“保留”功能)。
因此,“保留”功能毫无意义。
答案 5 :(得分:1)
有两种主要类型的内存:分配单个块的内存,如数组和向量,以及分布式内存,其成员抓取任何空的位置来填充。队列和linkest列表结构属于第二种类型,它们有一些特殊的实际的优点使得删除特定元素不会导致大规模存储器移动而不是数组和向量。因此,他们不需要预先保留任何空间,如果他们需要,他们只需通过连接到提示
答案 6 :(得分:0)
如果你的目标是对齐内存容器,你可以考虑实现这样的东西:
std::deque<std::vector> dv; //deque with dynamic size memory aligned vectors.
typedef size_t[N] Mem;
std::deque<Mem> dvf //deque with fixed size memory aligned vectors. Here you can store the raw bytes adding a header to loop through and cast using header information and typeid...
//templates and polymorphism can help storing raw bytes, checking the type where a pointer points for example, and creating an interface to access the partial aligned memory.
或者,您可以使用映射来访问向量而不是双端队列...