写在最前面:除非必要,否则我们应该尽量选择使用vector,而弃用deque。记住一句话:一切表面皆假象!
vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。随便吃进。
(1)vector的空间配置数据结构:
iterator start; //已使用空间的头
iterator finish; //已使用空间的尾
iterator end_of_storage; //目前可用空间的尾 (我们都知道一个vector的容量永远大于或者等于其大小)
利用这三个迭代器便可轻易的提供首位标识、大小、容量、空容器判断、最前端元素值、最后端元素值等机能。
(2)详解vector的动态分配空间:
void push_back(const T& x) {
if (finish != end_of_storage) { // 还有备用空間
construct(finish, x); // 直接在備用空間中建構元素。
++finish; // 調整水位高度
}
else // 已無備用空間
insert_aux(end(), x);
}
template <class T, class Alloc>
void vector<T, Alloc>::insert_aux(iterator position, const T& x) {
if (finish != end_of_storage) { // 還有备用空間
// 在备用空間起始處建構一個元素,并以vector 最後一個元素值為其初值。
construct(finish, *(finish - 1));
// 調整水位。
++finish;
T x_copy = x;
copy_backward(position, finish - 2, finish - 1)