其实一种循环结构就是一种迭代操作。
在STL中,容器的迭代器被作为容器元素对象或者I/O流中的对象的位置指示器,因此可以把它理解为面向对象的指针–一种泛型指针或通用指针。不依赖于元素的真实类型。迭代器是为了降低容器和泛型算法至今联系而设计的,泛型算法的参数不是容器。是迭代器。

容器的迭代器的作用就类似一个游标,它屏蔽了底层存储空间的不连续性,在上层使容器元素有一种连续的假象。
接下来简单实现下list迭代器

#pragma once
#include <iostream>
#include <assert.h>
using namespace std;template<class T>
struct _ListNode
{_ListNode<T>* _prev;_ListNode<T>* _next;T _data;_ListNode(const T& data):_data(data), _prev(NULL), _next(NULL){}
};
template<class T,class Ref,class Ptr>
//ref为引用,ptr为指针类型
struct _ListIterator
{typedef _ListNode<T> Node;typedef _ListIterator<T, Ref, Ptr> self;typedef _ListIterator<T, Ref, Ptr> Iterator;typedef Ref Reference;typedef Ptr Pointer;Node* _node;_ListIterator(Node* node):_node(node){}Ref operator*(){return _node->_data;}Ptr operator->(){return &(_node->_data);}self& operator++(){_node = _node->_next;return *this;}self operator++(int)//后置++{Node* temp = _node;_node = _node->_next;return temp;}self& operator--(){_node= _node->_prev;return *this;}self& operator--(int)//后置--{Node* temp = _node;_node = _node->_prev;return temp;}bool operator==(const self& s){return _node == s._node;}bool `
perator!=(const self& s){return _node != s._node;}
};
//ReserveIterator迭代器就可以移正向迭代器为模板。再次基础上是反向迭代器。
template <class Iterator>
struct ReserveIterator
{ReserveIterator(Iterator it):_it(it){}typename Iterator::Reference operator*(){return *_it;}typename Iterator::Pointer operator->(){return operator->();}ReserveIterator operator++(){--_it;return *this;}ReserveIterator operator++(int){ReserveIterator temp = _it;--_it;return temp;}ReserveIterator operator--(){++it;return *this;}ReserveIterator operator--(int){ReserveIterator temp = _it;++_it;return temp;}bool operator!=(ReserveIterator<Iterator>& rit){return _it != rit._it;}Iterator _it;
};
//list迭代器的使用实现常规操作
template<class T>
class List
{typedef _ListNode<T> Node;
public:typedef _ListIterator<T, T&, T*> Iterator;typedef _ListIterator<T, const T&, const T*> ConstIterator;typedef ReserveIterator<Iterator> ReserveIterator;//typedef ReserveIterator<ConstIterator> ConstReserveIterator;List(){_head = new Node(T());_head->_next = _head;_head->_prev = _head;}void clear(){Iterator it = Begin();while (it!= End()){Node* del = it._node;it++;delete del;}}~List(){clear();delete _head;_head = NULL;}Iterator End(){return Iterator(_head);}ConstIterator End() const{return ConstIterator(_head);}ReserveIterator REnd(){return ReserveIterator(End());}/*ConstReserveIterator REnd() const{return ConstReserveIterator(End());}*/ReserveIterator RBegin(){return ReserveIterator(--End());}/*ConstReserveIterator RBegin() const{return ConstReserveIterator(End());}*/Iterator Begin(){return Iterator(_head->_next);}ConstIterator Begin() const{return ConstIterator(_head->_next);}Node* Buynode(const T& x){ Node* newnode = new Node(x);return newnode;}void Insert(Iterator pos, const T& x)//在pos位置前插入{Node* cur = pos._node;Node* prev = cur->_prev;Node* temp = Buynode(x);temp->_prev = prev;prev->_next = temp;temp->_next = cur;cur->_prev = temp;}void Erase(Iterator& pos){assert(pos != _head);Node* cur = pos._node;Node* prev = cur->_prev;Node* next = cur->_next;prev->_next = next;next->_prev = prev;delete cur;}void PushBack(const T& data){/*Node* temp = Buynode(data);Node* tail = _head->_prev;temp->_prev = tail;tail->_next = temp;temp->_next = _head;_head->_prev = temp;*/Insert(End(), data);}void PushFront(const T& data){Insert(Begin(), data);}void PopBack(){Erase(--End());}void PopFront(){Erase(Begin());}void PrintList(){Iterator it = Begin();while (it != End()){cout << *it << " ";it++;}cout << endl;}
protected:Node* _head;
};
void TestList()
{List<int> l;l.PushBack(1);l.PushBack(2);l.PushBack(3);l.PushBack(4);//l.PrintList();///*l.PopBack();//l.PopBack();//l.PopBack();//l.PopBack();*///l.PushFront(8);//l.PushFront(0);//l.PrintList();//l.PopFront();//l.PopFront();//l.PopFront();//l.PrintList();List<int>::ReserveIterator it = l.RBegin();while (it != l.REnd()){cout << *it << " ";it++;}cout << endl;
}

迭代器(list迭代器的实现)相关推荐

  1. C++中的迭代器(STL迭代器)iterator

    1.Cpp中的迭代器 要访问顺序容器和关联容器中的元素,需要通过迭代器(iterator)进行.迭代器是一个变量,相当于容器和操纵容器的算法之间的中介.迭代器可以指向容器中的某个元素,通过迭代器就可以 ...

  2. es6 迭代器_揭秘ES6迭代器和迭代器

    es6 迭代器 by Tiago Lopes Ferreira 由Tiago Lopes Ferreira 揭秘ES6迭代器和迭代器 (Demystifying ES6 Iterables & ...

  3. python列表迭代器_python迭代器生成器-迭代器和list区别

    迭代 生成 for循环遍历的原理 for循环遍历的原理就是迭代,in后面必须是可迭代对象 为什么要有迭代器 对于序列类型:字符串.列表.元组,我们可以使用索引的方式迭代取出其包含的元素.但对于字典.集 ...

  4. python3生成器与迭代器_python3迭代器和生成器 | 吴老二

    迭代函数就是一个利用for...in来完成的一个过程,但是呢?在没说迭代函数之前我们需要了解一下什么是迭代器,什么是生成器,两者的区别是什么,先一个一个的学习. 迭代器 先学习一下什么是迭代器,迭代器 ...

  5. mysql迭代器_迭代器 - 刘海子 - 博客园

    一,三层装饰器 import time def outter1(func): def wrapper(*args, **kwargs): start = time.time() res = func( ...

  6. javascript迭代器_JavaScript迭代器概述

    javascript迭代器 by Joanna Gaudyn 乔安娜·高登(Joanna Gaudyn) JavaScript迭代器概述 (An overview of JavaScript iter ...

  7. php mysql迭代器_php 迭代器

    迭代器(Iterator)模式,又叫做游标(Cursor)模式.GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节. 百度百科: http: ...

  8. pythonzip是迭代器_Python迭代器和zip

    迭代器就像一个项目流.您只能一次查看流中的项目,并且只能访问第一个元素.要查看流中的某些内容,您需要将其从流中删除,一旦您从流的顶部获取内容,它就会从流中消失. 当您调用zip(i,i)时,zip首先 ...

  9. 迭代器以及迭代器的作用

    #迭代器 ''' 迭代是访问集合元素的一种方式,迭代器是一个能够记住遍历位置的对象 迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问完结束 如果想访问一个元素,需要把这个元素前面的所有元素 ...

  10. python3生成器与迭代器_Python3迭代器与生成器

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...

最新文章

  1. Python 数据结构视频教程一
  2. windows安装jenkins及ant/maven/jdk配置
  3. 卷积神经网络 全连接层(稠密层)是什么?(全连接层就是每一个结点都与上一层的所有结点相连的网络层)
  4. 如何用SPSS做协方差分析?超详细图文教程
  5. 如何将现有的项目添加到远程的git库里面!
  6. 数据告诉你,抖音是如何在半年之内逆袭的
  7. 【学习笔记】第四章——文件 II(基本操作、文件保护、文件系统层次结构、磁盘结构、磁盘调度算法)
  8. OpenShift 4 之Istio-Tutorial (6) 服务恢复能力(重试、超时、断路器)
  9. 2.5 分类模型评估指标—AUC与ROC及绘制混淆矩阵与ROC曲线
  10. Flink Forward Asia Hackathon 正式启动,10W 奖金等你来!
  11. 菁搜FTP搜索引擎 photo
  12. 速达开发版ERP移动端 App 操作使用说明
  13. N卡和A卡各型号参数对比收集
  14. 1434:相亲的胖胖
  15. 优秀的flash站点收集(30+)
  16. ARM的合法立即数与非法立即数
  17. 网易100天---46、Things You Need to Know About Snapchat
  18. 校内网API的.net版本XiaoNei.Net 1.0(非官方)
  19. 硬盘坏道早知道,原来NAS还有这些工具可以预知硬盘状态
  20. 莫烦pytorch CNN卷积神经网络

热门文章

  1. 删了 GPL 协议转闭源?法院判决:GPL 协议终身有效
  2. 动漫绘画软件优动漫PAINT最近所用文件
  3. IOS开发 阅读器类APP可用开源框架介绍(2)
  4. nodemon : 无法加载文件 C:\Users\cell\AppData\Roaming\npm\nodemon.ps1,因为在此系统上禁止运行脚本。
  5. 如何在CSDN中发布文章
  6. 版本动态 | Apache Linkis(Incubating) 计算中间件1.1.2 版本发布
  7. 使用百度Clouda框架创建RSS阅读器应用
  8. 【Python】(1)基础语法笔记
  9. 基于Python的图片批量转PDF实现
  10. 实现 Google 第三方授权登录