来自《数据结构与算法分析》第三章,实现类的时候设计底层的接口越少越好,如只在 erase 中执行 delete,其他删除操作只调用 erase,而不是直接用 delete

#include <iostream>
using namespace std;template<typename T>
class List{//双向链表实现,包含了头尾哨兵节点可以把头尾节点视为普通节点处理简化程序
private:struct Node{ //struct是默认成员公有的class,这里其本身是private的,不会有什么问题;T data;Node* pre;Node* next;Node(const T& d=T(),Node* p=nullptr,Node* n=nullptr):data(d),pre(p),next(n){};};int size;Node* head;Node* tail;void init(){size=0;head=new Node;tail=new Node;head->next=tail;tail->pre=head;}public:class const_iterator{protected:  //protected使此类的子类能访问成员,但其他类不可以Node* cur;T& retrieve() const {return cur->data;}const_iterator(Node* p):cur(p){}; //构造函数friend class List<T>; //使List能访问成员public:const_iterator():cur(nullptr){}; //重载构造函数,默认存储空指针const T& operator*() const {return retrieve();}const_iterator& operator++(){  //++iter时调用,对比下面的iter++重载,可以知道一般++iter快于iter++cur=cur->next;return *this;}const_iterator& operator++(int){ //重载后缀++,int的意义仅仅是为了重载的语法需要提供不同的函数标识,iter++时调用const_iterator old=*this;++(*this); //实际调用了上面实现的operator++()return old;}bool operator== (const const_iterator& rhs) const{return cur==rhs.cur;}bool operator!= (const const_iterator& rhs) const{return !(*this==rhs);} //这行实际调用了上面重载的==};class iterator:public const_iterator{   //iterator公有派生自const_iterator,能用父类的地方都能用子类,子类比父类功能更多protected:iterator(Node* p):const_iterator(p){}; //调用父类构造函数friend class List<T>;public:iterator(){};T& operator*(){return this->retrieve();}        //不用this调用的话有时会编译出错const T& operator*() const{return const_iterator::operator*();}iterator& operator++(){  //++iter时调用,对比下面的iter++重载,可以知道一般++iter快于iter++//cout << "调用++iter" << endl;this->cur=this->cur->next;return *this;}iterator& operator--(){  //++iter时调用,对比下面的iter++重载,可以知道一般++iter快于iter++this->cur=this->cur->pre;return *this;}iterator& operator++(int){ //重载后缀++,int的意义仅仅是为了重载的语法需要提供不同的函数标识,iter++时调用iterator old=*this;++(*this);return old;}};List(){init();};List(const List& rhs){init();*this=rhs;}~List(){clear();delete head;delete tail;}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);}  //begin返回的是真正的头节点,不是哨兵节点const_iterator begin() const {return const_iterator(head->next);} //函数后面的const表示不会修改成员变量,是const_iterator的关键iterator end(){return iterator(tail);}          //end返回的是哨兵节点,不是真正的尾结点const_iterator end() const{return const_iterator(tail);}int Size() const {return size;}bool empty() const {return size==0;}void clear(){while (!empty()) pop_front();}T& front(){return *begin();}const T& front() const {return *begin();}T& back(){return *--end();}const T& back() const {return *--end();}void push_front(const T& x){insert(begin(),x);}void push_back(const T& x){insert(end(),x);}void pop_front(){erase(begin());}void pop_back(){erase(--end());}iterator insert(iterator itr,const T& x){Node* p=itr.cur;size++;return iterator(p->pre=p->pre->next=new Node(x,p->pre,p)); //插入的节点之前的节点是p->pre,之后的节点是p}iterator erase(iterator itr){Node* p=itr.cur;iterator retVal(p->next);   //erase删除节点后返回后一个节点size--;p->pre->next=p->next;  //修改删除节点的前一个节点nextp->next->pre=p->pre;    //修改删除节点的后一个节点predelete p;return retVal;}iterator erase(iterator start,iterator end){for (iterator itr=start;itr!=end;) itr=erase(itr);return end;}
};int main(){List<int> l;for (int i=1;i<10;i++) l.push_back(i);l.pop_back();l.insert(l.end(),37);//cout << *(--l.end());for (List<int>::iterator itr=l.begin();itr!=l.end();++itr) cout << *itr << ' ';l.erase(l.begin(),++l.begin());cout << endl;for (auto itr=l.begin();itr!=l.end();itr++) cout << *itr << ' ';return 0;
}

数据结构与算法分析:实现list【理解 iter++ 和 ++iter 】相关推荐

  1. 《Python数据结构与算法分析》第一章课后习题

    这里写自定义目录标题 Introduction 练习题 Python易错总结: Introduction 最近开始学数据结构,打算用python作为语言,看的书是米勒和戴维的<Python数据结 ...

  2. 数据结构与算法分析 收获总结 第1章 数据结构和算法

    这学期学这门课到现在为止,还是感觉难度很大,当然老师可能讲得也有点偏离书本,有时候听得有点蒙. 干脆来根据教材写个总结,用的教材是 <数据结构与算法分析>C++ 第3版 电子工业出版社 第 ...

  3. 数据结构与算法分析 - 5 - 二叉树

    1.树 描述:自由树是一个连通的,无回路的无向图. 树不是一种线性结构,但它具有一定的线性特征. 树也可以这样定义:树是由根结点和若干颗子树构成的.树是由一个集合以及在该集合上定义的一种关系构成的.集 ...

  4. python数据结构与算法40题_Python数据结构与算法分析(笔记与部分作业)

    最近为了给写搬砖脚本增加一些算法知识,脑残的看起来算法书.Python数据结构与算法分析,本人英语比较差,看的是翻译版本的. 网上有免费的原版的:https://runestone.academy/r ...

  5. Weiss的数据结构与算法分析(C++版)源码编译说明

    最近尝试编译Weiss的那本数据结构与算法分析(C++版)提供的源代码时,遇到一些问题,特记录如下: 考虑到该书提供的代码是使用模板技术较多,这在提供简洁代码的同时,也给源码的编译带来了一些问题.因而 ...

  6. 数据结构与算法分析(C++版)(第二版)

    查看书籍详细信息: 数据结构与算法分析(C++版)(第二版) 内容简介 本书采用程序员最爱用的面向对象C++语言来描述数据结构和算法,并把数据结构原理和算法分析技术有机地结合在一起,系统介绍了各种类型 ...

  7. 数据结构与算法分析c++第四版_研分享 | 人工智能学院数据结构与算法分析考研备考整理...

    数据结构与算法分析 1.在顺序表中插入或删除一个元素,需要平均移动(表中一半)元素,具体移动的元素个数与(表长和该元素在表中的位置)有关. 2.如果有两个数,每个数的所有约数(除它本身以外)的和正好等 ...

  8. 数据结构与算法分析-第2章

    <?xml version="1.0" encoding="utf-8"?> 数据结构与算法分析-第2章 数据结构与算法分析-第2章 Table o ...

  9. (c#)数据结构与算法分析 --递归

    递归     不知道有新手听没听过别人拿剥糖块来形容递归,诸如一层层地剥好比一层层地进入递归.这种比喻可是误导了我,只想着剥了,其实剥完皮儿,取出糖块,再把皮儿一层层地穿上才算个完整的递归. 递归就是 ...

  10. 二叉堆(最小堆)(数据结构与算法分析的代码实现)

    "堆是一棵被完全填满的二叉树,可能的例外是在底层,底层上的元素从左到右填入.这样的树称为完全二叉树" "因为完全二叉树很有规律,所以可以用一个数组表示而不需要使用链&qu ...

最新文章

  1. ML 神经网络 NeuralNetworks
  2. 苹果系统怎么降低版本_1903、1809...到底怎么看系统版本?
  3. 再度冲刺“农村电商第一股”,汇通达还有什么法宝?
  4. C语言: 函数调用的开销
  5. ASP.NET Core跨域设置
  6. 前端学习(2971):静态打包资源
  7. Elasticsearch —— bulk批量导入数据
  8. 用有穷状态自动机描述计算机网络的传输层协议,计算机网络基椽—第八章(传输层)(全).ppt...
  9. [leetcode] Power of Two 判断一个数是否是2的平方
  10. kali 创建php可执行文件_Kali安装wordpress
  11. 腾讯CDC:用户流失原因调研四步经
  12. Mysql常用函数大全(分类汇总讲解)
  13. 【python】python 包构建工具setup.py
  14. Java-Spring Boot集成银联在线网关支付及回调处理(银联扫码等方式支付)
  15. 计算机网络安全讲座心得,学习信息安全心得体会
  16. 设计院总工毕生总结的200条经验
  17. Ubuntu安装人脸识别认证软件Howdy
  18. C语言结构体复习(一)
  19. 11111111111
  20. 删除win7右键菜单intel的图形属性和图形选项

热门文章

  1. html 列表 表格 form表单 文本域 label
  2. 线性代数笔记33——基变换和图像压缩
  3. 机器学习基础随笔(3)
  4. 【IoT毕业设计】树莓派开发板+机智云IoT+监测机器人
  5. MVC已过时,MOVE时代来临?
  6. Android 微信支付宝授权获取用户信息
  7. java计算机毕业设计自考学位系统源程序+mysql+系统+lw文档+远程调试
  8. 自动化鼠标和键盘操作pyautogui
  9. linux nginx进程占用80端口杀不掉
  10. [USACO2019JAN]Sleepy Cow Sorting题解