G2.9源码结构
在低版本下list的结构比较简单,就是一个list模板类和一个node模板类。总体的数据结构事宜个环形双向链表。
begin()指向头结点,end()指向尾节点。
- 迭代器
源码中迭代器的结构如下,迭代器重载了前++,后++,->,*等一系列操作符,为了达到指针的效果。
这里需要注意的第一个是++这个操作符重载,形如:
1 | self operator++(int){....} |
的为后置++,而前置++ 不需要形参:
1 | self& operator++(){...} |
为什么后置++返回self,而后置返回一个引用呢?是为了阻止后置++连续使用,也就是下面这种形式:
1 | i++++;//错误 self类型不能++ |
另外需要注意的是->这个操作符重载,下面这个图阐述的很清楚:
G4.9版本
相对于G2.9版本,4.9版本的list充分利用了面向对象的设计方法,将实现类与基础类分割开,这符合effective c++的设计条款,但是对于源码阅读来说就不是很友好了。但是很庆幸,在基础的设计上新版本并没有特别多的改动,基本思想和原版本一致。
list的原理十分简单,下面简单总结一下list的使用。
方法 | 作用 |
---|---|
erase() | 删除一个元素 |
front() | 返回第一个元素 |
get_allocator() | 返回list的配置器 |
insert() | 插入一个元素到list中 |
max_size() | 返回list能容纳的最大元素数量 |
merge() | 合并两个list |
pop_back() | 删除最后一个元素 |
pop_front() | 删除第一个元素 |
push_back() | 在list的末尾添加一个元素 |
push_front() | 在list的头部添加一个元素 |
remove() | 从list删除元素 |
remove_if() | 按指定条件删除元素 |
resize() | 改变list的大小 |
reverse() | 把list的元素倒转 |
sort() | 给list排序 |
unique() | 删除list中重复的元素 |
splice() | 合并两个list |