标签:c++
#pragma once template<class T> struct __ListNode { __ListNode<T>* _next; __ListNode<T>* _prev; T _data; __ListNode(const T& x = T()) :_next(NULL) ,_prev(NULL) ,_data(x) {} }; template<class T, class Ref, class Ptr> struct __ListIterator { typedef __ListIterator<T, Ref, Ptr> Self; typedef T ValueType; typedef Ref Reference; typedef Ptr Pointer; ////////////////////////////////////////////////////////////////////////// __ListNode<T>* _node; ////////////////////////////////////////////////////////////////////////// __ListIterator() {} __ListIterator(__ListNode<T>* x) :_node(x) {} bool operator==(const Self& s) { return _node == s._node; } bool operator!=(const Self& s) { return _node != s._node; } Reference operator*() { return _node->_data; } //前置++ Self& operator++() { _node = _node->_next; return *this; } //后置++ Self operator++(int) { Self tmp(*this); _node = _node->_next; return tmp; } //前置-- Self& operator--() { _node = _node->_prev; return *this; } //后置-- Self operator--(int) { Self tmp(*this); _node = _node->_prev; return tmp; } }; template<class T> class List { public: typedef __ListNode<T> ListNode; typedef __ListIterator<T, T&, T*> Iterator; List() { _head = new ListNode; _head->_next = _head; _head->_prev = _head; } void Insert(Iterator pos, const T& x) { ListNode* cur = pos._node; ListNode* prev = cur->_prev; ListNode* tmp = new ListNode(x); prev->_next = tmp; tmp->_next = cur; tmp->_prev = prev; cur->_prev = tmp; } void PushBack(const T& x) { Insert(End(), x); } void PushFront(const T& x) { Insert(Begin(), x); } void PopBack() { Erase(--End()); } Iterator Erase(Iterator pos) { assert(!pos.End()); ListNode* prev = pos._node->_prev; ListNode* next = pos._node->_next; prev->_next = next; next->_prev = prev; delete pos._node; return Iterator(next); } Iterator Begin() { return Iterator(_head->_next); } Iterator End() { return Iterator(_head); } protected: ListNode* _head; }; void Test() { List<int> list; list.PushBack(1); list.PushBack(2); list.PushBack(3); list.PushBack(4); List<int>::Iterator it = list.Begin(); while (it != list.End()) { *it = 10; cout<<*it<<" "; ++it; } cout<<endl; }
本文出自 “zgw285763054” 博客,请务必保留此出处http://zgw285763054.blog.51cto.com/11591804/1827263
标签:c++
原文地址:http://zgw285763054.blog.51cto.com/11591804/1827263