容器 List
双向循环链表
- 数据成员:node
- node 中 有两个void* 指针,一个T类型元素。
- 源码中有很多的typedef,需要往前找到底是什么类型
- 注意void* 应该在后面操作时转换为T*
- 分配器使用的是 alloc
iterator - smart pointer
- 在链表的结束位置放置了一个哨兵节点:list.end();
- 对迭代器++时应该指向链表的下一个节点,而不是单纯的指针++操作
- 使用运算符重载(5个)来实现
-
dereference
-
成员访问运算符
-
前置++
-
后置++ int 没有意义,形式上做区分
-
前置,后置-- ,没有列出。
注意ctor 到底是在哪里调用的
- 前置++返回的是自身的引用,不会有临时对象的生成
- 后置++返回的是临时对象 会调用ctor
- 考虑前置++ 和后置++ 的行为
运算符的行为要与作用在int上的行为一致。
前置++返回的是自身的引用
后置++返回的是对象(匿名)
使用的形式
GNUC 4.9 的iterator
- void* pointer
- 迭代器传了三个模版参数,没有必要传三个参数,一个就好了
GNUC4.9 list 继承结构,过于复杂了
- list的size是多少?里面还有compressed_pair 使用了其他的技术来优化
Iterator需要遵循的规则
- iterator_traits 所需的五种typedef