在deque中内存是一块一块的分配的
#define _DEQUESIZ (sizeof (_Ty) <= 1 ? 16 \
: sizeof (_Ty) <= 2 ? 8 \
: sizeof (_Ty) <= 4 ? 4 \
: sizeof (_Ty) <= 8 ? 2 : 1) /* elements per block (a power of 2) */
_DEQUESIZ定义了每一块的大小,每次超出边界时会分配一个新的block
这样做的优势在于无需因内存的大小不够而进行大量的数据拷贝。对内存的使用上也会更加符合需求,不会浪费大量未使用的内存。
这样做在查询的时候会比较不方便一点,所以在_Deque_const_iterator中作了特殊的处理,在查询效率上会有所下降。
在vector中当出现空间不够时,会以50%的增长率去分配内存。同时会将原来的内容拷贝到新的区域。这样会降低插入的性能。当时如果预先reserve了足够的区域,则效率会大大高于deque。同时在查询时由于是连续的存储区域,效率也会高于deque。
这是插入时内存不足时的处理方式。
_Capacity = max_size() - _Capacity / 2 < _Capacity
? 0 : _Capacity + _Capacity / 2; // try to grow by 50%
if (_Capacity < size() + _Count)
_Capacity = size() + _Count;
pointer _Newvec = this->_Alval.allocate(_Capacity);
pointer _Ptr = _Newvec;
_TRY_BEGIN
_Ptr = _Umove(_Myfirst, _VEC_ITER_BASE(_Where),
_Newvec); // copy prefix
_Ptr = _Ufill(_Ptr, _Count, _Tmp); // add new stuff
_Umove(_VEC_ITER_BASE(_Where), _Mylast, _Ptr); // copy suffix
_CATCH_ALL
_Destroy(_Newvec, _Ptr);
this->_Alval.deallocate(_Newvec, _Capacity);
_RERAISE;
_CATCH_END
这里有一个从外部分析的文章 http://dev.csdn.net/article/48/article/48/48881.shtm

