1. Iterator
首先定义两个迭代器类型。
typedef _list_iterator<T, T&, T*> iterator;
typedef _list_iterator<T, const T&, const T*> const_iterator;
2. begin()
这是两个 begin 函数,作用是返回第一个元素节点。
为什么要重载两个 begin 呢?这是因为当对象是 const 常量时,只能调用 const 成员函数。这个版本的 begin() 被声明为 const,保证了在常量对象上也能获取迭代器。
iterator begin() { return _head->_next; }
const_iterator begin() const { return _head->_next; }
3. end()
end 函数的作用是返回哨兵头结点。
返回这个节点是因为 end 在设计的时候是被说明指向最后一个的下一个,所以在这里指向头结点。
这样设计有三个好处:
- 无需区分空链表和非空链表的边界判断
- 遍历循环可以统一写成
for (auto it = begin(); it != end(); ++it) - 插入 / 删除操作在首尾位置时不需要特殊处理
iterator end() { return _head; }
const_iterator end() const { return _head; }
4. empty_init()
这个函数并不是 C++ 标准库中的标准函数,是为了方便创建出来的。
作用是初始化 list。因为是双向循环链表,所以要这么初始化。
void empty_init() {
_head = new Node;
_head->_prev = _head;
_head->_next = _head;
}
5. 构造函数
构造函数利用前面写的 empty_init() 来进行构造。
list() { (); }


