STL——list and vector

这节学习下stl中list和vector的底层实现原理。这里我主要针对侯捷老师讲解的STL源码剖析进行总结。
简易实现

list实现原理

STL——list and vector_第1张图片
上图很好的展示了一个list类的构成,其主要包含迭代器,并且其成员类型是list_node *指针,因此一个list的大小其实就是一个list_node *指针的大小。list实际上是双向链表,为了符合前闭后开的原则,链表中会有一个尾部空结点即图中灰色部分,其不属于我们list中的数据。每个list_node结点包含三个数据,前向指针,后向指针和本身包含的数据。

list_iterator

STL——list and vector_第2张图片
迭代器的具体实现,迭代器的成员类型是_list_node,就是指向结点的指针,这里需要注意的是四个迭代器函数的实现。
STL——list and vector_第3张图片
下面函数是前向++的实现,返回的是迭代器的引用,上面函数是后向++的实现,返回的是旧迭代器。
STL——list and vector_第4张图片
这里是两个操作符重载的实现。

vector实现原理

STL——list and vector_第5张图片
一个vector实际上是动态数组,其内存分配是一段连续空间,每个vector类有三个成员,即三个迭代器指针,start是起始指针,finish是数据结尾指针,end_of_storage是容量结尾指针,容量通常大于等于数据量大小,如果数据量大于vector的容量需要进行2倍扩容。
STL——list and vector_第6张图片
上图是push_back函数的实现,当finish指针不等于end_of_storage时即当前未达到容量极限时,直接进行添加数据即可,当数据量等于容量时,此时容量已满,需要进行扩容处理,即调用insert_aux函数。
STL——list and vector_第7张图片
上图是具体的扩容函数insert_aux,该函数的大致功能是,重新申请一块大小是原来两倍的内存,并将原vector中的元素全部拷贝过来,添加新元素x,最后释放原vector的内存,并更新start,finish和end_of_storage指针,使其指向新的内存块。因此在每次扩容时都会大量调用拷贝构造函数(拷贝原来的元素到新的内存块),这会造成大量的成本开销。

vector_iterator

STL——list and vector_第8张图片
vector的迭代器实现就十分简单了,只需要是一种指向内存的指针即可。

你可能感兴趣的:(STL源码解析)