c++STL系列:list

G2.9源码结构

在低版本下list的结构比较简单,就是一个list模板类和一个node模板类。总体的数据结构事宜个环形双向链表。
begin()指向头结点,end()指向尾节点。

  • 迭代器

源码中迭代器的结构如下,迭代器重载了前++,后++,->,*等一系列操作符,为了达到指针的效果。
这里需要注意的第一个是++这个操作符重载,形如:

1
self operator++(int){....}

的为后置++,而前置++ 不需要形参:

1
self& operator++(){...}

为什么后置++返回self,而后置返回一个引用呢?是为了阻止后置++连续使用,也就是下面这种形式:

1
2
i++++;//错误 self类型不能++
++++i;//正确

另外需要注意的是->这个操作符重载,下面这个图阐述的很清楚:

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