博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自己造容器List
阅读量:6336 次
发布时间:2019-06-22

本文共 3927 字,大约阅读时间需要 13 分钟。

//自己造容器--List/*1、iterator2、头迭代器3、尾迭代器4、链表长5、判空6、清除7、取头元素8、取尾元素9、头插入10、尾插入11、头删除12、尾删除13、插入函数14、删除函数*/template
class List{private: //结点 struct Node { Object data; Node *prev; //前置指针 Node *next; //后置指针 Node(const Object & d = Object(), Node*p = NULL, Node*n = NULL) : data(d), prev(p), next(n){} };public: //迭代器 class const_iterator { public: const_iterator() :current(NULL){} //*重载 const Object & operator*()const { return retrieve(); } //pre++重载 const_iterator & operator++() //前置++,返回引用 { current = current->next; return *this; //this是一个指向iterator的指针 } //pre-- const_iterator & operator--() //前置--,返回引用 { current = current->prev; return *this; //this是一个指向iterator的指针 } //pos++重载 const_iterator operator++(int) //后置++,返回参数 { const_iterator old = *this; ++(*this); return old; } //pos-- const_iterator operator--(int) //后置--,返回参数 { const_iterator old = *this; --(*this); return old; } //==重载 bool operator==(const const_iterator & rhs)const { return current == rhs.current; } //!=重载 bool operator!=(const const_iterator & rhs)const { return !(current == rhs.current); } protected: //在一般迭代器中变为private Node*current; Object &retrieve()const { return current->data; } const_iterator(Node*p) :current(p){} friend class List
; }; //一般迭代器继承常迭代器 class iterator : public const_iterator { public: iterator(){} Object &operator*() { return retrieve(); } //以免被上一个operator*覆盖 const Object& operator*()const { return const_iterator::operator*(); } //pre++ iterator operator++() { current = current->next; return *this; } //pre-- iterator operator--() { current = current->prev; return *this; } //pos++ iterator operator++(int) { iterator old = *this; ++(*this); return old; } //pos-- iterator operator--(int) { iterator old = *this; --(*this); return old; } protected: iterator(Node*p) : const_iterator(p){} friend class List; };public: //the big three List() { init(); } ~List() { clear(); delete head; delete tail; } List(const List &rhs) { init(); *this = rhs; } const List& operator=(const List & rhs) { if (this == &rhs) return *this; clear(); for (const_iterator itr = rhs.begin(); itr != rhs.end(); ++itr) push_back(*itr); return *this; } //头迭代器 iterator begin() { return iterator(head->next); } const_iterator begin()const { return const_iterator(head->next); } //尾迭代器 iterator end() { return iterator(tail); } const_iterator end()const { return const_iterator(tail); } //链长 int size()const { return theSize; } //判空 bool empty()const { return size() == 0; } //清除 void clear() { while (!empty()) { pop_front(); } } //取头元素 Object & front() { return *begin(); } const Object & front()const { return *begin(); } //取尾元素 Object & back() { return *--end(); } const Object & back()const { return *--end(); } //前插 void push_front(const Object&x) { insert(begin(), x); } //后插 void push_back(const Object&x) { insert(end(), x); } //前删 void pop_front() { erase(begin()); } //后删 void pop_back() { erase(--end()); } //插入 iterator insert(iterator itr, const Object &x) { theSize++; Node *p=itr.current; /*Node*q=new Node(x, p->prev, p); p->prev->next=q; p->prev=q; return iterator(q); */ return iterator(p->prev = p->prev->next = new Node(x, p->prev, p)); } //单个删除 iterator erase(iterator itr) { Node*p = itr.current; iterator retVal(p->next); p->prev->next = p->next; p->next->prev = p->prev; delete p; theSize--; return retVal; } //多个删除 iterator erase(iterator start, iterator end) { iterator itr; for (itr = start; itr != end;) itr = erase(itr); return itr; }private: int theSize; Node *head; Node *tail; void init() { theSize = 0; head = new Node; tail = new Node; head->next = tail; tail->prev = head; }};

  

转载于:https://www.cnblogs.com/KennyRom/p/5949263.html

你可能感兴趣的文章
获取SQL数据库中的数据库名、所有表名、所有字段名、列描述
查看>>
Orchard 视频资料
查看>>
简述:预处理、编译、汇编、链接
查看>>
调试网页PAIP HTML的调试与分析工具
查看>>
路径工程OpenCV依赖文件路径自动添加方法
查看>>
玩转SSRS第七篇---报表订阅
查看>>
WinCE API
查看>>
SQL语言基础
查看>>
对事件处理的错误使用
查看>>
最大熵模型(二)朗格朗日函数
查看>>
html img Src base64 图片显示
查看>>
[Spring学习笔记 7 ] Spring中的数据库支持 RowMapper,JdbcDaoSupport 和 事务处理Transaction...
查看>>
FFMPEG中关于ts流的时长估计的实现(转)
查看>>
Java第三次作业
查看>>
【HDOJ 3652】B-number
查看>>
android代码混淆笔记
查看>>
Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) C. String Reconstruction 并查集
查看>>
BMP文件的读取与显示
查看>>
Flash文字效果
查看>>
各种排序算法总结篇(高速/堆/希尔/归并)
查看>>