精华内容
下载资源
问答
  • 迭代器是什么

    2013-12-07 10:02:05
    迭代器是什么 分类: C/C++2010-05-07 16:06 1877人阅读 评论(4) 收藏 举报 iteratorvectorlist算法insertclass  在学习c++ STL的时候,整天碰到迭代器,也整天用,但是,到底它是个什么东西,很多人没有...
     

    迭代器是什么

    分类: C/C++ 1877人阅读 评论(4) 收藏 举报

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

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

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

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

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

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

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

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

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

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

    展开全文
  • 迭代器是什么 Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的迭代方法。迭代器可以在迭代的过程中删除底层集合的元素。 这个方法在调用时不需要任何参数,它是访问可...

    迭代器是什么

    Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的迭代方法。迭代器可以在迭代的过程中删除底层集合的元素。

    这个方法在调用时不需要任何参数,它是访问可迭代序列的一种方式,通常其从序列的第一个元素开始访问,直到所有的元素都被访问才结束。

    Iterator接口里面的方法:

    • boolean hasNext();
      该方法英语判断集合对象是否还有下一个元素,如果已经是最后一个元素则返回false
    • E next();
      把迭代器的指向移到下一个位置,同时,该方法返回下一个元素的引用
    • default void remove() {
      throw new UnsupportedOperationException(“remove”);
      }

      从迭代器指向的Collection中移除迭代器返回的最后一个元素,该操作使用的比较少
    • default void forEachRemaining(Consumer<? super E> action) {
      Objects.requireNonNull(action);
      while (hasNext())
      action.accept(next());
      }

      default void forEachRemaining(Consumer<? super E> action)对每个剩余元素执行给定的操作,直到所有元素都被处理或动作引发异常。 如果指定了该顺序,则按迭代的顺序执行操作。 动作抛出的异常被转发给呼叫者。
      实现要求:
      默认实现的行为如下:
      while (hasNext()) action.accept(next());
      参数 :
      action - 要为每个元素执行的操作
      异常 :
      NullPointerException - 如果指定的动作为空
      从以下版本开始:
      1.8

    迭代器的优点:

    使用迭代器不要求事先准备好整个迭代过程中的所有元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后元素可以不存在或者被销毁。因此迭代器适合遍历一些数量巨大甚至无限的序列。

    迭代器的作用

    下文摘自这里:点击查看

    迭代器—不必知道序列底层是怎么实现的,就可以利用迭代器来访问一个序列。

    任何容器类,都必须有某种方式可以插入元素并将它们再次取回。毕竟,持有事物是容器的最基本的工作。对于List,add()是插入元素的方法之一,而get()是取出元素的方法之一。

    迭代器(也是一种设计模式)的概念可以帮助我们达到一种目的。什么目的呢?能够将遍历序列的操作和序列底层相分离

    迭代器是一个对象,它的工作是遍历并选择序列中的对象,而客户端程序员不需要知道该序列底层的结构。此外,迭代器通常被称为轻量级对象:创建它的代价小。因此,经常可以见到对迭代器有一些奇怪的限制;例如,java的Iterator只能单向移动,这个Iterator只能用来:

    1. 使用方法iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素;
    2. 使用next()获取序列中下一个元素;
    3. 使用hasNext()检查序列中是否有元素;
    4. 使用remove()将迭代器新返回的元素删除。

    —能够将遍历序列的操作和序列底层相分离。也正因为如此,我们有时会说:迭代器统一了对容器的访问方式。

    public class CrossContainerIteration {
        public static void display(Iterator<Pet> it) { 
            while(it.hasNext()) { 
                Pet p = it.next();
                System.out.print(p.id() + ":" + P + " ");
            }
        System.out.println();
        }
    }
    

    上面这段代码显示了“迭代器”的威力,不知道Pet的类型,但是利用迭代器实现了对Pet序列的遍历。

    展开全文
  • Javascript 迭代器是什么 JavaScript迭代器是在ES6中引入的,用于循环一系列值,通常是某种集合。根据定义,迭代器必须实现next() 函数,该函数以{value,done}的形式返回对象,其中 value 是迭代序列中的下一个值...

    Javascript 迭代器是什么

    JavaScript迭代器是在ES6中引入的,用于循环一系列值,通常是某种集合。根据定义,迭代器必须实现next() 函数,该函数以{value,done}的形式返回对象,其中 value 是迭代序列中的下一个值, done 是一个布尔值,用于确定序列是否已被使用.

    一个非常简单的例子如下:

    // Javascript
    class LinkedList {
      constructor(data) {
        this.data = data;
      }
    
      firstItem() {
        return this.data.find(i => i.head);
      }
    
      findById(id) {
        return this.data.find(i => i.id === id);
      }
    
      [Symbol.iterator]() {
        let item = {next: this.firstItem().id};
        return {
          next: () => {
            item = this.findById(item.next);
            if(item) {
              return {value: item.value, done: false};
            }
            return {value: undefined, done: true};
          }
        };
      }
    }
    
    const myList = new LinkedList([
      {id: 'a10', value: 'First', next: 'a13', head: true },
      {id: 'a11', value: 'Last', next: null, head: false },
      {id: 'a12', value: 'Third', next: 'a11', head: false },
      {id: 'a13', value: 'Second', next: 'a12', head: false }
    ]);
    
    for(let item of myList) {
      console.log(item);    // 'First', 'Second', 'Third', 'Last'
    }
    

    在上面的示例中,我们实现了一个LinkedList数据结构,它在内部使用一个数据数组,其中每个项都有一个值,以及一些用于确定其在序列中位置的实现特定属性。从这个类构造的对象在默认情况下是不可iterable的,因此我们通过使用符号.迭代器并对其进行设置,使返回的序列根据类的内部实现按顺序排列,而返回的项仅返回其值。

    迭代器

    另一方面,迭代器只是函数,这意味着可以像调用任何其他函数一样调用它们(例如,将迭代委托给现有迭代器),同时也不限于符号.迭代器名称,允许我们为同一对象定义多个迭代器。下面是这些概念的一个例子:

    class SpecialList {
      constructor(data) {
        this.data = data;
      }
    
      [Symbol.iterator]() {
        return this.data[Symbol.iterator]();
      }
    
      values() {
        return this.data
          .filter(i => i.complete)
          .map(i => i.value)
          [Symbol.iterator]();
      }
    }
    
    const myList = new SpecialList([
      {complete: true, value: 'first'},
      {complete: true, value: 'second'},
      {complete: false},
      {complete: true, value: 'third'}
    ]);
    
    for(let item of myList) {
      console.log(item);  
    }
    
    for(let item of myList.values()) {
      console.log(item);  // 'first', 'second', 'third'
    }
    

    在本例中,我们使用数据对象的本机数组迭代器使specialist iterable,返回数据数组的精确值。同时,我们还定义了一个values方法,它本身就是一个迭代器,使用数组.prototype.filter()Array.prototype.map(),然后最终返回符号.迭代器对于结果,只允许对序列中的非空对象进行迭代,并且只返回每个对象的值。

    以上就能通过自定义方法,来获取想要的迭代器,比如,你要在可迭代对象组内,获取 对象内的某一个特定的key-value。记得使用[Symbol.iterator] 函数方法

    展开全文
  • 1.迭代器是什么? 首先,我们需要想理解容器什么。这里的容器指定并不是云计算中的容器,实际上,我们可以认为,容器就是将多个元素在一起的单元,并且,是可以迭代的,可以遍历容器内部的对象的。看到这里,会不会...

    1.迭代器是什么?

    首先,我们需要想理解容器什么。这里的容器指定并不是云计算中的容器,实际上,我们可以认为,容器就是将多个元素在一起的单元,并且,是可以迭代的,可以遍历容器内部的对象的。看到这里,会不会觉得挺熟悉的?没错,列表,元组,字典这些都是容器。
    理解完容器是什么,再来看看什么是迭代器。只要定义了__next__() (python3的操作)或next() (python2的操作)),他就是一个迭代器。迭代器可以用于迭代操作,将我们容器中的每一个对象迭代获取。
    迭代器可以看作使用for循环对容器进行遍历。那迭代器最主要的优点又是什么呢?
    比如:我们定义一个列表,是从1到10000的,显然这么大的数据量会占用我们一定的内存,而当我们仅需要对1到10000进行遍历时,列表占用这么大的内存实属浪费。我们可以用迭代器的方法,对列表使用iter()的方法生成一个迭代器,迭代器并没有一次性把所有元素都加载到内存里,而是以一种延迟计算的方式来返回元素(等到使用__next__时才返回)这样,占用空间就会大大减小,这正是他的一大优点。

    2.生成器是什么?

    生成器可以理解为特殊的迭代器。但其相比与迭代器,占用的内存更少。他本质上是一个函数,只不过函数的return改为了yield语句,正常的for循环语句,会不停的遍历容器的对象,然后返回(如果有return的话),当我们用yield取而代之,我们便可以对函数进行挂起操作,也就是说,每当函数执行时遇到yield时,他会记住此时的一个位置并挂起,等到使用__next__操作时,才由上一次挂起的位置继续执行。

    3.总结两者的区别

    迭代器,在创建的时候已经生成,在需要的时候再去操作迭代器加载元素到内存中,而生成器,本质是一个可以暂时挂起的函数,等到需要时再继续执行去生成元素,这样子,使得生成器比迭代器更省内存。

    展开全文
  • PHP中迭代器是什么

    2018-10-12 07:45:00
    PHP中迭代器是什么? from:https://www.cnblogs.com/onephp/p/6109061.html 迭代器:类继承PHP的Iterator接口,批量操作。 //迭代器模式,在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素。 //相比传统...
  • 那么,迭代器到底是什么呢? 我们知道,尽管不同容器的内部结构各异,但它们本质上都是用来存储大量数据的,换句话说,都是一串能存储多个数据的存储单元。因此,诸如数据的排序、查找、求和等需要对数据进行遍历的...
  • js中迭代器是什么,怎么理解与实现呢?一、为何会出现迭代器?背景前提:迭代器想要解决的问题是:举个栗子:功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片...
  • 迭代器是什么(转)

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

    千次阅读 2016-04-10 11:56:23
    迭代器 Iterator  什么是迭代器?  对已集合类中的任何一个实现类,都可以返回这样一个...迭代器是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什
  • Java中迭代器是什么

    万次阅读 多人点赞 2016-08-16 21:31:31
    可迭代是Java集合框架下的所有集合类的一种共性,也就是把集合中的所有元素遍历一遍。迭代的过程需要依赖一个迭代器对象,那么什么是迭代器呢?...从定义上看,迭代器是为容器而生,它本质上就是一种遍历
  • 迭代器是什么鬼?

    2018-03-13 21:48:00
    1. 那些数据类型支持迭代 ...2. 迭代器本质 # lst = ['皇阿玛','皇额娘','容嬷嬷','紫薇'] # it = lst.__iter__() # lst的迭代器 # while 1: # try: # name = it.__next__() # 循环拿...
  • 迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。    C++数据流迭代器...
  • Java中迭代器是什么?(转)

    千次阅读 多人点赞 2018-06-08 12:59:17
    可迭代是Java集合框架下的所有集合类的一种共性,也就是把集合中的所有元素遍历一遍。迭代的过程需要依赖一个迭代器对象,那么什么是迭代器呢...从定义上看,迭代器是为容器而生,它本质上就是一种遍历的算法。因为...
  • ▎写在前面  之前一直听别人说用什么迭代器之类的话,认为很高深,今天看了看,感觉也不是很...迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。然而迭代...
  • 最近在学习paddlepaddle深度学习框架,在实战波士顿房价预测例子的时候,yield函数困扰到了我。索性,我就将python迭代器琢磨了一遍,终于弄清楚了...一句话:迭代器是可以记住遍历位置的函数。(有C基础的可对比指针)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,796
精华内容 2,718
关键字:

迭代器是什么