//链表结点结构
template <class T>
struct _list_node
{
typedef void *void_pointer;
//指针类型为void *,其实可以设为_list_node<T>*
void_pointer prev;
void_pointer next;
T data;
};
/*
迭代器有五种类型,Input Iterator,output Iterator,Forward Iterator只支持++,Biderectional Iterator支持++、--,Random Access Iterator支持
所有运算,效率最高
*/
struct input_iterator_tag{};
struct output_iterator_tag{};
struct forward_iterator_tag :public input_iterator_tag{};
struct bidirectional_iterator_tag :public forward_iterator_tag{};
struct random_access_iterator_tag :public bidirectional_iterator_tag{};
//list迭代器设计
template <class T,class Ref,class Ptr>
struct _list_iterator
{
typedef _list_iterator<T, T&, T*> iterator;
typedef _list_iterator<T, Ref, Ptr>self;
//traits萃取
typedef bidirectional_iterator_tag iterator_category;
typedef T value_type;
typedef Ptr pointer;
typedef Ref reference;
typedef ptrdiff_t difference_type;
typedef _list_node<T>* link_type;
typedef size_t size_type;
link_type node;//迭代器内部的普通指针,指向list的结点
//构造函数
_list_iterator(link_type x) :node(x){}
_list_iterator(){}
_list_iterator(const iterator& x) :node(x.node){}
reference operator*()const
{
return (*node).data;
}
pointer operator->()const
{
return &(operator*());
}
//前增量
self &operator++()
{
node = (link_type)((*node).next);
return *this;
}
//后增量
self operator++(int)
{
self tmp = *this;
++*this;
return tmp;
}
self &operator--()
{
node = (link_type)((*node).prev);
return *this;
}
self operator--(int)
{
self tmp = *this;
--*this;
return tmp;
}
};
//SGI list是一个环状双向链表
template<class T,class Alloc=alloc>
class list
{
protected:
typedef _list_node<T> list_node;
public:
typedef list_node* link_type;
protected:
link_type node;//该指针表示整个环状双向链表,可使其指向置于尾端的一个空白结点
//list缺省使用alloc作为空间配置器,并据此另外定义了list_node_allocator,为的是更方便地以节点大小为配置单位
typedef simple_alloc<list_node, Alloc>list_node_allocator;
};