#include <cstdio>
#include <iostream>
using namespace std;
/*
*循环双向链表
*insert,splice 都不会造成原有的list迭代器失效.
*
*/
template <class T>
struct _list_node {
typedef void * void_pointer;
void_pointer prev;
void_pointer next;
T data;
};
template <typename T, typename Ref, typename Ptr>
struct _list_iterator {
typedef _list_iterator<T, T&, T*> iterator;
typedef _list_iterator<T, Ref, Ptr> self;
typedef bidirectional_iterator_tag iterator_category;//双向指针尾
typedef T value_type;
typedef Ptr pointer;
typedef Ref reference;
typedef _list_node<T> * link_type;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
link_type node;//迭代器内部当然要有一个普通指针,指向list的节点
//constructor
_list_iterator(link_type x) : node(x) {}
_list_iterator() {}
_list_iterator(const iterator & x) :node(x.node){}
bool operator == (const self & x) const { return node == x.node;}
bool operator != (const self & x) const { return 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;
}
};
int main()
{
while (1) ;
return 0;
}
细看,细读.慢慢品味,发现其中无穷乐趣啊.