迭代器是什么(转)

2023-10-14 02:32
文章标签 迭代 器是

本文主要是介绍迭代器是什么(转),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

迭代器是什么

    在学习c++STL的时候,整天碰到迭代器,也整天用,但是,到底它是个什么东西,很多人没有一个认识。这里我通过几个小的DEMO,来看看迭代器。首先我实现了一个十分简陋的vector类:

 

[cpp]
template <class T>  
  1. class vector  
  2. private:  
  3.     T* pbegin;  
  4.     int n; //当前大小  
  5. public:  
  6.     vector()  
  7.         pbegin new T[100]; //暂时先固定大小  
  8.         0;  
  9.      
  10.       
  11.     T* begin()  
  12.         return pbegin;  
  13.      
  14.     void insert(T d){  
  15.         pbegin[n++] d;  
  16.      
  17.     typedef T* iterator; //vector的迭代器就是基础指针类型  
  18. };  
 

我们知道,vector是数组实现的,也就是说,只要知道数组的首地址,就能知道后面每个元素的位置,所以,访问vector的迭代器,其实就是一个基础的指针类型,我们可以通过++,--等操作,来遍历访问该vector。

 

[cpp]   
//测试vector  
  1.     vector<int> a;  
  2.     a.insert(1);  
  3.     a.insert(2);  
  4.     vector<int>::iterator itra;  
  5.     itra a.begin();  
  6.     printf("%d/n", *itra);   
  7.     itra++;  
  8.     printf("%d/n", *itra);  
  9.     itra--; //基础指针类型都支持++,--,+,-等操作符  
  10.     printf("%d/n", *itra);  
 

哇~~,原来vector的迭代器那么简单,那么,我们来考虑一下List,这是链表,我们知道,链表每个元素都存储在不同的位置,我们一般通过指向下一个元素的next指针来找到下一个元素。那么,我们怎么样来设计一个迭代器,然后可以直接对这个迭代器进行++,--等操作二遍历访问整个链表呢:

 

[cpp]
template <class T>  
  1. class List{  
  2. private:  
  3.     struct Node{ //链表的节点  
  4.         data;  
  5.         Node* next;  
  6.     };  
  7.     Node* pbegin; //表头  
  8.     class List_iterator{ //链表的迭代器  
  9.         Node* cur; //当前指向  
  10.     public:  
  11.         void operator (Node* ptr)  
  12.             cur ptr;  
  13.          
  14.         void operator ++ ()  
  15.             cur cur->next;  
  16.          
  17.         // ...还可以重载-- -等操作符  
  18.         operator (){  
  19.             return cur->data;  
  20.          
  21.     };  
  22. public  
  23.     List()  
  24.         pbegin=NULL;  
  25.      
  26.     Node* begin()  
  27.         return pbegin;  
  28.      
  29.     void insert(T d)  
  30.         Node* p=pbegin;  
  31.         while(p && p->next) p=p->next;  
  32.         Node* new Node;  
  33.         t->data d;  
  34.         t->next NULL;  
  35.         if(pbegin==NULL)  
  36.             pbegin t;  
  37.         else  
  38.             p->next t;  
  39.      
  40.     typedef List_iterator iterator; //List的迭代器是一个类  
  41. };  
 

为List设计的迭代器是一个类,这个类支持++操作来向后移动遍历链表:

 

[cpp]
/ /测试List  
  1.     List<int> b;  
  2.     b.insert(1);  
  3.     b.insert(2);  
  4.     List<int>::iterator itrb;  
  5.     itrb b.begin();  
  6.     printf("%d/n", *itrb);  
  7.     itrb++; // 该迭代器只支持++  
  8.     printf("%d/n", *itrb);  
 

通过这两个例子,可以看出,迭代器是跟容器紧密结合的,不同的容器,它的迭代器不同,但是,他们有共同的目标,就是可以通过该迭代器,来遍历访问这个容器里面的元素。这样带来的好处是在STL设计算法时,可以脱离容器而设计更加通用的算法。比如,在容器中查找一个元素。查找,这个操作一般来说就是遍历整个集合,然后找到那个要找的元素,但是,如果没有迭代器,我们需要为vector和List设计两个查找算法,因为找下一个元素在vector和List中的操作不同。同样的思想却要两套代码,显然这是不优秀的。

    有了模板,我们可以将算法和特定的数据分离开来,而有了迭代器,我们可以将算法和特定的容器分离开来。

这篇关于迭代器是什么(转)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/207533

相关文章

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

多线程篇(阻塞队列- LinkedBlockingDeque)(持续更新迭代)

目录 一、LinkedBlockingDeque是什么 二、核心属性详解 三、核心方法详解 addFirst(E e) offerFirst(E e) putFirst(E e) removeFirst() pollFirst() takeFirst() 其他 四、总结 一、LinkedBlockingDeque是什么 首先queue是一种数据结构,一个集合中

多线程篇(阻塞队列- LinkedBlockingQueue)(持续更新迭代)

目录 一、基本概要 1. 构造函数 2. 内部成员 二、非阻塞式添加元素:add、offer方法原理 offer的实现 enqueue入队操作 signalNotEmpty唤醒 删除线程(如消费者线程) 为什么要判断if (c == 0)时才去唤醒消费线程呢? 三、阻塞式添加元素:put 方法原理 图解:put线程的阻塞过程 四、非阻塞式移除:poll方法原理 dequ

六、我们应当怎样做需求调研:迭代

前面我一直在反复强调这样一个观点,需求分析不是一蹴而就的,是一个反复迭代的过程。它将从第一次需求分析开始,一直持续到整个项目生命周期。为什么这样说呢?让我们一起来分析分析。  在第一次的需求分析阶段,我们在一段时期内需要与客户进行反复地讨论,这个过程往往是这样一个反复循环的过程:需求捕获->需求整理->需求验证->再需求捕获••••••  需求捕获,就是我们与客户在一起开研讨会

多线程篇(阻塞队列- ArrayBlockingQueue)(持续更新迭代)

目录 一、源码分析 1. 先看个关系图 2. 构造方法 3. 核心属性 4. 核心功能 入队(放入数据) 出队(取出数据) 5. 总结 一、源码分析 1. 先看个关系图 PS:先看个关系图 ArrayBlockingQueue是最典型的有界阻塞队列,其内部是用数组存储元素的, 初始化时需要指定容量大小利用 ReentrantLock 实现线程安全。 在生产者

多线程篇(并发相关类- 原子操作类)(持续更新迭代)

目录 前言 一、原子变量操作类(AtomicLong为例) 1. 前言 2. 实例 二、JDK 8新增的原子操作类LongAdder 三、LongAccumulator类原理探究 前言 JUC包提供了一系列的原子性操作类,这些类都是使用非阻塞算法CAS实现的,相比使用锁实现原子性操作这在性能上有很大提高。 由于原子性操作类的原理都大致相同,这里讲解最简单的AtomicLo

PMP–一、二、三模–分类–14.敏捷–技巧–帮助团队交付价值的执行实践迭代和增量如何帮助交付工作产品

文章目录 技巧一模14.敏捷--实践--帮助团队交付价值的执行实践--持续集成--在不同层面测试、验收测试驱动开发 (ATDD) 、测试驱动开发和行为驱动开发、刺探 。90、 [单选] 敏捷项目的第一次迭代即将开始。发起人召集团队、Scrum主管、产品负责人和其他项目干系人参加启动会议。发起人强调需要在项目尽可能早的时候以最小的成本识别和应对项目风险。与会者实现发起人要求的最佳方式是什么?

设计模式-行为型模式-迭代器模式

1.迭代器模式的定义         迭代器模式提供一种对容器对象中的各个元素进行访问的方法,而不需要暴露该对象的内部细节;         在软件系统中,容器对象有两个职责:一是存储数据,二是遍历数据;从依赖性上看,前者是基本职责,而后者是可以变化的,又是可以分离的,因此可以将遍历数据的行为从容器中抽取出来,封装到迭代器对象中,由迭代器来提供遍历数据的行为,这将简化聚合对象的设计,更加符合单

java设计模式(行为型模式:状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式)

6,行为型模式 6.5 状态模式 6.5.1 概述 【例】通过按钮来控制一个电梯的状态,一个电梯有开门状态,关门状态,停止状态,运行状态。每一种状态改变,都有可能要根据其他状态来更新处理。例如,如果电梯门现在处于运行时状态,就不能进行开门操作,而如果电梯门是停止状态,就可以执行开门操作。 类图如下: 代码如下: public interface ILift {//电梯的4个状态//

【Python知识宝库】迭代器与生成器:高效处理大数据集

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、迭代器:逐个访问数据的艺术1. 迭代器的定义2. 自定义迭代器3. 迭代器的优势 二、生成器:按需生成数据的魔法1. 生成器的定义2. 创建生成器生成器函数生成器表达式 3. 生成器的优势 三、迭代器和生成器在处理