迭代器与List
来源:互联网 发布:热力学计算软件 编辑:程序博客网 时间:2024/06/05 01:07
List是一个容器,在STL库中(标准模板库)。实质上就是一个双向链表,而且这个双向链表是有头的;他有一个空的头结点,插入删除时不用判断表中有无数据,双向循环可以轻易的_head->prev轻松地找到最后一个节点end。
它使用内置的迭代器来遍历和管理这个容器,迭代器就像指针一样管理着这个空间,重载实现了与指针以一样的++、*、= 、!=等操作符。 下面让我们简单的模拟实现以下吧。
struct ListNode //双向链表结点{ListNode(const T& data = 0):_next(NULL), _prev(NULL), _data(data){}T _data;ListNode<T>* _next;ListNode<T>* _prev;};
template<class T>class List{typedef ListNode<T> Node;public:typedef _Iterator<T, T&, T*> Iterator;typedef _Iterator<T, const T&, const T*> ConstIterator;typedef _ReverseIterator<T, T&, T*> ReverseIterator;typedef _ReverseIterator<T, const T&,const T*> ConstReverseIterator;List():_head(NewNode()){_head->_next = _head;_head->_prev = _head;}~List(){release();delete _head;}Node* NewNode(const T& x){return new Node(x);}Node* NewNode(){return new Node();}void PushBack(const T& x) //尾插{Node* tail = _head->_prev;Node* tmp = NewNode(x);tail->_next = tmp;tmp->_prev = tail;tmp->_next = _head;_head->_prev = tmp;}Iterator Begin() //定义返回迭代器类型的Begin()和End() {return Iterator(_head->_next);}Iterator End(){return Iterator(_head);}ConstIterator Begin()const {return ConstIterator(_head->_next);}ConstIterator End()const{return ConstIterator(_head);}ReverseIterator rBegin() //定义返回迭代器类型的rBegin()和rEnd(){return ReverseIterator(_head->_prev);}ReverseIterator rEnd(){return ReverseIterator(_head);}ConstReverseIterator rBegin()const{return ConstReverseIterator(_head->_prev);}ConstReverseIterator rEnd()const{return ConstReverseIterator(_head);}void release(){Node* tmp = _head->_next;while (tmp != _head){Node* del = tmp;tmp = tmp->_next;delete del;}}Iterator Erase(Iterator it){Node* prev = it._node->_prev;Node* next = it._node->_next;delete it._node;prev->_next = next;next->_prev = prev;return prev;}void PopBack(){Erase(_head->_prev);}void remove(int pos){Iterator it = Begin();while (it != End()){if (pos == 1)it = Erase(it);++it;--pos;}}protected:Node* _head;};List实现了尾删和尾插还有随机位置的删除
#includeusing namespace std;template struct ListNode{ListNode(const T& data = 0):_next(NULL), _prev(NULL), _data(data){}T _data;ListNode * _next;ListNode * _prev;};template struct _Iterator{typedef ListNode Node;typedef _Iterator Self;_Iterator(Node* node):_node(node){}Ref operator*(){return _node->_data;}Self& operator++(){_node = _node->_next;return *this;}bool operator!=(const Self& other)const{return other._node != _node;}Node* _node;};template struct _ReverseIterator{typedef ListNode Node;typedef _Iterator Self;_ReverseIterator(Node* node):_node(node){}Ref operator*(){return _node->_data;}Self& operator++(){_node = _node->_prev;return *this;}bool operator!=(const Self& other)const{return other._node != _node;}Node* _node;};template class List{typedef ListNode Node;public:typedef _Iterator Iterator;typedef _Iterator ConstIterator;typedef _ReverseIterator ReverseIterator;typedef _ReverseIterator ConstReverseIterator;List():_head(NewNode()){_head->_next = _head;_head->_prev = _head;}~List(){release();delete _head;}Node* NewNode(const T& x){return new Node(x);}Node* NewNode(){return new Node();}void PushBack(const T& x) //尾插{Node* tail = _head->_prev;Node* tmp = NewNode(x);tail->_next = tmp;tmp->_prev = tail;tmp->_next = _head;_head->_prev = tmp;}Iterator Begin() //定义返回迭代器类型的Begin()和End() {return Iterator(_head->_next);}Iterator End(){return Iterator(_head);}ConstIterator Begin()const {return ConstIterator(_head->_next);}ConstIterator End()const{return ConstIterator(_head);}ReverseIterator rBegin() //定义返回迭代器类型的rBegin()和rEnd(){return ReverseIterator(_head->_prev);}ReverseIterator rEnd(){return ReverseIterator(_head);}ConstReverseIterator rBegin()const{return ConstReverseIterator(_head->_prev);}ConstReverseIterator rEnd()const{return ConstReverseIterator(_head);}void release(){Node* tmp = _head->_next;while (tmp != _head){Node* del = tmp;tmp = tmp->_next;delete del;}}Iterator Erase(Iterator it){Node* prev = it._node->_prev;Node* next = it._node->_next;delete it._node;prev->_next = next;next->_prev = prev;return prev;}void PopBack(){Erase(_head->_prev);}void remove(int pos){Iterator it = Begin();while (it != End()){if (pos == 1)it = Erase(it);++it;--pos;}}protected:Node* _head;};
0 0
- 迭代器与List
- 【STL】迭代器与List的模拟实现
- list<?>与list<T>区别
- List 与 数组 互转
- vector与list区别
- List与ArrayList区别
- IList 与 List
- IList 与List 区别
- Map与List区别?
- List合并与排序
- 泛型List与DataGridView
- List与table结合
- List 与 explode
- select 与 list
- List ArrayList与Vector
- Java 数组与 List
- 数组与list转化
- vector与list区别
- 根据Url异步下载图片,并将图片保存到本地
- 用C++实现的一道面试大题-猫狗大战
- jquery的图片轮播效果
- 【百度笔试】度度熊买帽子
- 冒泡算法
- 迭代器与List
- 学习gulp的绝佳ppt
- Part 1: From App to OpenShift (Runtimes and Templates)
- 微信小程序
- 最小生成树 Prim算法
- iOS多线程学习
- Boost库之asio io_service以及run、run_one、poll、poll_one区别
- 把二叉树打印成多行
- Handler原理讲解及源码分析