【STL】模拟STL中的List轮
2016-09-13 20:25
162 查看
直接进入正题:
先来看看list轮是个什么东西
每一个节点都一个prev指针和一个next指针,除了第一个节点没有内容,但它的prev指针指向最后一个节点,最后一个元素的next指针指向第一个元节点
首先看看STL库中的list 接口:(本文全部用类模版实现)
要实现这么多的函数,这里只是实现基本的函数
定义节点结构
测试函数
由于我的编译器太卡,所以用了一个clock()测试程序运行时间,但是没有什么卵用,测试1秒,出个程序至少30秒,这他吗就尴尬了
哈哈哈哈哈哈
先来看看list轮是个什么东西
每一个节点都一个prev指针和一个next指针,除了第一个节点没有内容,但它的prev指针指向最后一个节点,最后一个元素的next指针指向第一个元节点
首先看看STL库中的list 接口:(本文全部用类模版实现)
要实现这么多的函数,这里只是实现基本的函数
定义节点结构
template<class T> struct _ListNode { _ListNode<T>* _prev; _ListNode<T>* _next; T _data; _ListNode(const T& x) :_prev(NULL) ,_next(NULL) ,_data(x) { } };模拟迭代器功能
template<class T,class Ref,class Ptr> struct _ListIterator { typedef _ListNode<T> Node; typedef _ListIterator<T,Ref,Ptr> Self; _ListIterator(Node* node) :_node(node) {} _ListIterator() {} Ref operator*() { return _node->_data; } /*Ref operator->() { return *this; }*/ bool operator==(const Self& s) { return _node==s._node; } bool operator!=(const Self& s) { return _node!=s._node; } Self& operator++()//后置++,返回++之后的值 { _node=_node->_next; return *this; } Self& operator++(int)//前置++,返回++之前的值 { Self tmp(_node); _node=_node->_next; return tmp; } Self& operator--()//后置--,返回--后的值 { _node=_node->_prev; return *this; } Self& operator--(int)//前置--,返回--前的值 { Self tmp(_node); _node=_node->_prev; return tmp; } Node* _node; };模拟list取名MyList
template<class T> class MyList { typedef _ListNode<T> Node; public: typedef _ListIterator<T,T&,T*> Iterator; typedef _ListIterator<T,const T&,const T*> ConstIterator; Node* BuyNode(const T& x) { Node* node=new Node(x); return node; } MyList() { _Head=BuyNode(T()); _Head->_next=_Head; _Head->_prev=_Head; } void PushBack(const T& x) { Insert(End(),x); } void PushFront(const T& x) { Insert(Begin(),x); } void PopFront() { Earse(Begin()); } void Insert(Iterator Pos,const T&x) { Node* cur=Pos._node; Node* prev=cur->_prev; Node* tmp=BuyNode(x); tmp->_next=cur; cur->_prev=tmp; prev->_next=tmp; tmp->_prev=prev; } void Earse(Iterator Pos) { assert(Pos!=End()); Node* cur=Pos._node; Node* prev=cur->_prev; Node* next=cur->_next; next->_prev=prev; prev->_next=next; }
Node* Find(const T& x) { Node* cur=_Head; while(cur) { if(cur->_data==x) break; cur=cur->_next; } return cur; }
<pre name="code" class="cpp">Iterator Begin() { return Iterator(_Head->_next); } Iterator End() { return Iterator(_Head); } Node* _Head; };
测试函数
#include <iostream> #include<cstdlib> #include<ctime> #include "MyList.h" using namespace std; void ListTest() { <pre name="code" class="cpp"> MyList<int> l; l.PushBack(1); l.PushBack(2); l.PushBack(3); l.PushBack(4); l.PushBack(5); l.Earse(l.Find(3)); l.PushFront(7); l.PushFront(8); l.PushFront(9); l.PopFront(); MyList<int>::Iterator iter=l.Begin(); while (iter!=l.End()) { cout<<*iter<<" "; ++iter; } cout<<endl;
<pre name="code" class="cpp">} int main() { long start,end; start=clock(); ListTest(); end=clock(); cout<<end-start<<endl; system("pause"); return 0; }
由于我的编译器太卡,所以用了一个clock()测试程序运行时间,但是没有什么卵用,测试1秒,出个程序至少30秒,这他吗就尴尬了
哈哈哈哈哈哈
相关文章推荐
- HDU 1276 STL链表模拟
- STL库中的vector的使用和模拟实现
- STL-模拟实现list
- UVaLive 6581 && Gym 100299B What does the fox say? (模拟+STL)
- 类模板模拟实现STL中List
- hdu 4879 ZCC loves march (模拟+STL)
- 【STL】 list的应用及模拟实现
- hdu6168-多校9&stl&模拟- Numbers
- 【STL】【模拟】Codeforces 696A Lorenzo Von Matterhorn
- hdoj 2 括号配对问题【数组模拟实现+STL实现】
- POJ 1208 The Blocks Problem 栈模拟 练STL
- stl的map1------[NWPU][2018寒假作业][通用版]二、stl ,模拟,贪心等 [Cloned]A题
- STL中vector的使用以及模拟实现
- UVa 12219 Common Subexpression Elimination (stl,模拟,实现)
- 模拟实现STL下的list容器
- stl模拟 Codeforces Round #295 (Div. 1) B. Cubes
- 814-The Letter Carrier's Rounds【模拟、STL、被坑了】
- stl的map2------[NWPU][2018寒假作业][通用版]二、stl ,模拟,贪心等 [Cloned]B题
- POJ 字符串的全排列 水题也搞我 多种方法 DFS,STL,直接模拟。。。。。。
- Codeforces Round #345 (Div. 2)【A.模拟,B,暴力,C,STL,容斥原理】