1.vector的迭代器其实就是普通的指针,是Random Acess Iterators
2.vector占据的是线性连续空间。当空间不够时,也不是往原来的线性空间后面接着补,而是直接另找一块足够大小的线性连续空间,并把原来的旧的元素复制过去。
3.start指向目前使用空间的头,finish指向目前使用空间的尾,end_of_storage指向可用空间的尾。在finish和end_of_storage之间相当于备用空间。size()得到的是start到finish之间的长度,capacity()得到的是start到end_of_storage之间的长度
4.关于capacity()。
(1)vector<int> iv(2, 9)
得到的size和capacity相等,都是2。见p121下面vector的构造函数。
(2)如果备用空间不足以进行insert操作,那么会造成capacity的变化。如第2点所说,是另找一片线性空间。这片线性空间的大小是old_size + max(old_size, n)
,也就是旧长度的两倍或者旧长度+新增元素个数。
push_back和insert类似,但push_back调用的是insert_aux函数,当空间不够时,配置的空间大小就是原来的二倍(如果原来是空的,就配置为1)。
(3)reserve函数用来修改capacity()。当要求的新的空间大小比原来的小,那么它什么也不做;否则重新分配要求的新的空间大小。
5.insert在中间时,元素必须移动。似乎stl认为unitialized_copy比copy_backward的性能好,所以会根据不同情况,尽量优先使用unitialized_copy。见p126到p127。
6.vector的插入操作会引起迭代器失效。如果插入的元素数量没有超过capacity,那么只会造成插入位置之后的迭代器失效;如果插入元素数量超过capacity,所有元素都要搬家,这会导致所有迭代器失效。
7.vector的数据结构中有三个成员变量,是3中提到的start、finish、end_of_storage三个指针。所以vector的大小是24字节(64位系统的指针大小为8字节)。
vector<int> vi(3, 9);
cout << sizeof(vi) << endl;
输出的大小为24。