Dre*_*ann 14
增加a的大小std::vector
可能是昂贵的.当vector
超出其保留空间时,必须将向量的全部内容复制(或移动)到更大的保留空间.
这是特别是因为频繁的vector::reserve()
调整大小可能是昂贵的是deque
存在的.
相反,a std::vector
总是可以添加更多内存而无需重新定位现有元素.
对于vector
和string
,保留空间通过确保不需要复制/移动元素来防止最后的插入(直到容量)使迭代器和对早期元素的引用无效.这种搬迁也可能是昂贵的.
使用deque
和list
,之前的引用永远不会因最后的插入而失效,并且元素不会移动,因此不会出现保留容量的需要.
您可能认为使用vector
和string
保留空间也可以保证以后的插入不会抛出异常(除非构造函数抛出),因为不需要分配内存.您可能认为相同的保证对其他序列有用,因此deque::reserve
可能会有用.其实也有没有这样的保证了vector
和string
,虽然在大多数(所有?)实现这是真的.所以这不是预期的目的reserve
.
引用自C++参考
与 std::vector 不同,双端队列的元素不是连续存储的:典型的实现使用一系列单独分配的固定大小数组。
双端队列的存储会根据需要自动扩展和收缩。双端队列的扩展比 std::vector 的扩展便宜,因为它不涉及将现有元素复制到新的内存位置。
Deque 可以在任何需要的地方分配新内存并指向它,这与需要连续内存块来保存所有元素的向量不同。
归档时间: |
|
查看次数: |
11811 次 |
最近记录: |