标准 STL 向量容器具有“保留”功能,用于保留未初始化的内存,以便稍后使用以防止重新分配。
为什么其他双端队列容器没有?
增加
std::vector
的容量可能成本高昂。当 vector
超出其保留空间时,必须将向量的全部内容复制(或移动)到更大的保留空间。
正是因为 std::vector 调整大小的成本可能很高,所以存在
vector::reserve()
。 reserve()
可以准备一个std::vector
来预期达到一定的大小而不超过其容量。
相反,
deque
始终可以添加更多内存,无需重新定位现有元素。如果有 std::deque
可以
reserve()
记忆,那么几乎没有任何明显的好处。
vector
和
string
,保留空间通过确保不需要复制/移动元素来防止后面在末尾(直到容量)的插入使迭代器和对较早元素的引用无效。这次搬迁也可能代价高昂。使用
deque
和
list
,较早的引用永远不会因末尾的插入而失效,并且元素不会移动,因此不会出现预留容量的需要。您可能会认为,使用
vector
和
string
,保留空间还可以保证以后的插入不会抛出异常(除非构造函数抛出),因为不需要分配内存。您可能认为相同的保证对于其他序列也有用,因此
deque::reserve
会有可能的用途。事实上,
vector
和string
没有这样的保证,尽管在大多数(所有?)实现中这是正确的。所以这不是
reserve
的预期目的。
vector
有。双端队列不需要保留功能,因为元素不是连续存储的,并且在添加或删除元素时不需要重新分配和移动元素。
因此,“储备”功能没有任何意义。
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.
或者,您可以使用映射来访问向量而不是双端队列...