1.push_back()
push_back()函数用来往vector的末尾插入新元素,它的具体实现源码如下(基于G2.9):
1.push_back函数首先会检查是否还有空间,有就插入,没有就调用insert_aux
2.insert_aux也会先做一次剩余空间判断,这是因为调用该函数的不止push_back,可能存在其他插入函数没有做剩余空间检查。如果没有剩余空间,则根据原大小的n倍来计算新空间的大小,然后在内存中找到可以存放这个大小内容的空间。(这就是vector的n倍增长特性)
3.insert_aux找到新空间后会先把原地址的内容拷贝到新空间,再插入新元素,最后将原地址插入点后的内容也拷贝过去。同样也是因为调用该函数的不止vector容器,有些容器可以在中间插入,则需要将前后内容都拷贝。
4.最后将源地址空间的内容逐个释放。
由此可以看出vector的使用非常简单友好,但是存在大量拷贝和释放操作,也就是会不断地调用拷贝构造函数和析构函数,在使用vector时需要考虑到这个成本。
2.vector的迭代器
vector的结构是连续的,vector迭代器所需要的操作普通指针就可以做到,因此不需要特别的写一个智能指针(迭代器)。
根据之前学习的Iterator Traits(萃取机),vector的迭代器将通过普通指针的偏特化版本iterator_traits<T*>来回答五个问题。