iterator,什么是迭代器 iterator
大家好,今天来为大家分享iterator的一些知识点,和什么是迭代器 iterator的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
Java iterator()和next()原理用法
如果使用 Iterator来遍历集合中元素,一旦不再使用 List转而使用TreeSet来组织数据,那遍历元素的代码不用做任何修改,如果使用 for来遍历,那所有遍历此集合的算法都得做相应调整。
比如以后你的代码改了,list不在是list接口了,而是set接口(没有get(i)方法),
这时你的代码改动就大了,for里面全部要重写,而你老大的代码几乎不用任何修改,当然这也牺牲了部分性能
参考资料:http://bbs.csdn.net/topics/250025827
*****************************************希望帮助到你!************************************************
如果我的回答对你有帮助,
请点击我的回答下方【选为满意答案】按钮
谢谢!
什么是迭代器 iterator
迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器的内容。
为了方便的处理集合中的元素,Java中出现了一个对象,该对象提供了一些方法专门处理集合中的元素.
例如删除和获取集合中的元素.该对象就叫做迭代器(Iterator).
对 Collection进行迭代的类,称其为迭代器。还是面向对象的思想,专业对象做专业的事情,迭代器就是专门取出集合元素的对象。
但是该对象比较特殊,不能直接创建对象(通过new),该对象是以内部类的形式存在于每个集合类的内部。
什么是C++的迭代器Interator
容器就是数据结构的泛指,迭代器就是指针的泛指,可以指向元素。容器相当于一个储藏柜,里面装的许多不同的物品就像是储存的元素,比如面包、啤酒、苹果、现金。要取得各个物体就得用与各个物体向匹配的工具,如取出面包要用盘子、取出啤酒要用杯子、取出苹果要用篮子、取出现金要用钱包。迭代器的作用就相当于取出物品的工具的抽象,通过迭代器泛指现实生活中从贮藏室中取出物体的工具。C++迭代器是一种检查容器内元素并遍历元素的数据类型。1 Iterator definitionsIn C++, an iterator is any object that, pointing to some element in a range of elements(such as an array or a container), has the ability to iterate through the elements of that range using a set of operators(at least, the increment(++) and dereference(*) operators). The most obvious form of iterator is a pointer: A pointer can point to elements in an array, and can iterate through them using the increment operator(++). But other forms of iterators exist. For example, each container type(such as a vector) has a specific iterator type designed to iterate through its elements in an efficient way.C++迭代器Interator就是一个指向某种STL对象的指针。通过该指针可以简单方便地遍历所有元素。 C++中的iterator为STL中的重要概念。iterator的概念源自于对遍历一个线性容器工具的抽象,即如何你能访问这个容器的某个元素。对于最简单的数组,当然可以用数组的索引值,因为数组是连续存放在内存中的;但对于链表,就必须用指针。除此之外,还有还有很多种数据结构需要提供一个方便的工具来访问其中的元素,方法有ID,关键字等等。为了统一所有的容器的这种工具的使用,一般提供一整套容器的开发者就会用一种方式来表示各种容器的访问工具。例如C++ STL就是使用iterator。MFC自己的容器使用position。C#和java也有自己的方法,但方法是不变的。 iterator的用法可以被统一,但不同的底层容器实现其iterator的原理是不一样的。例如iterator++你可以理解为移动到容器的下一个元素,如果底层如果是数组,把索引值加一就行;如果底层是链表,就得执行类似于m_pCurrent= m_pCurrent-> pNext;的操作。因此每种容器都有自己的iterator实现方法。 C++ STL iterator的常用方法有: iterator++移到下个元素 iterator--移到上个元素*iterator访问iterator所指元素的值<>==!= iterator之间的比较,例如判断哪个元素在前 iterator1+ iterator2 iterator之间的加法运算,类似于指针加法 2容器的 iterator类型每种容器类型都定义了自己的C++迭代器类型,如 vector:vector<int>::iterator iter;这符语句定义了一个名为 iter的变量,它的数据类型是 vector<int>定义的 iterator类型。每个标准库容器类型都定义了一个名为 iterator的成员,这里的 iterator与迭代器实际类型的含义相同。begin和 end操作每种容器都定义了一对命名为 begin和 end的函数,用于返回迭代器。如果容器中有元素的话,由 begin返回的迭代器指向第一个元素: vector<int>::iterator iter= ivec.begin();上述语句把 iter初始化为由名为 vector操作返回的值。假设 vector不空,初始化后,iter即指该元素为ivec[0]。由end操作返回的C++迭代器指向 vector的“末端元素的下一个”。“超出末端迭代器”(off-the-end iterator)。表明它指向了一个不存在的元素。如果 vector为空,begin返回的迭代器与 end返回的迭代器相同。由 end操作返回的迭代器并不指向 vector中任何实际的元素,相反,它只是起一个哨兵(sentinel)的作用,表示我们已处理完 vector中所有元素。a)使用迭代器读取vector中的每一个元素vector<int> ivec(10,1); for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter){*iter=2;//使用*访问迭代器所指向的元素}b)const_iterator只能读取容器中的元素,而不能修改for(vector<int>::const_iterator citer=ivec.begin();citer!=ivec.end();citer++){cout<<*citer;//*citer=3; error}3 vector迭代器的自增和解引用运算C++迭代器类型定义了一些操作来获取迭代器所指向的元素,并允许程序员将迭代器从一个元素移动到另一个元素。迭代器类型可使用解引用操作符(dereference operator)(*)来访问迭代器所指向的元素:*iter= 0;解引用操作符返回迭代器当前所指向的元素。假设 iter指向 vector对象 ivec的第一元素,那么*iter和ivec[0]就是指向同一个元素。上面这个语句的效果就是把这个元素的值赋为 0。迭代器使用自增操作符向前移动迭代器指向容器中下一个元素。从逻辑上说,C++迭代器的自增操作和int型对象的自增操作类似。对 int对象来说,操作结果就是把 int型值“加 1”,而对迭代器对象则是把容器中的迭代器“向前移动一个位置”。因此,如果 iter指向第一个元素,则++iter指向第二个元素。由于 end操作返回的迭代器不指向任何元素,因此不能对它进行解引用或自增操作。
js迭代器iterator
iterator(迭代)一般很少直接使用,但是却是很常用很重要的功能.
例如:
对象的扩展运算符(...)内部其实是调用了 Iterator接口。
在es6中统一了遍历的接口 Iterator,Iterator接口的目的,就是为所有数据结构,提供了一种统一的访问机制,即for...of循环。
字符串也可以使用扩展运算符
rest运算符,与扩展运算符是逆运算
扩展运算符:数组=>分割序列
rest运算符:分割序列=>数组
rest可以代替arguments变量
回到主题,迭代
Symbol.iterator为每一个对象定义了默认的迭代器。
当需要对一个对象进行迭代时(比如开始用于一个 for..of循环中),它的@@iterator方法都会在不传参情况下被调用,返回的迭代器用于获取要迭代的值。
一些内置类型拥有默认的迭代器行为,其他类型(如 Object)则没有。下表中的内置类型拥有默认的@@iterator方法:
更多信息请参见迭代协议。
js中对象分为可迭代和不可迭代如果是可迭代哪它就会有一个[Symbol.iterator]函数
这个函数就是对象的迭代器函数,如用for of如果遍历的对象没有这个迭代方法那么就会报错.
for of传入的是可迭代对象,但是如何吧一个不可迭代的对象变为可迭代的对象呢!很简单就是自己写一个[Symbol.iterator]函数。
你以为迭代就这么简单的结束了吗?现在再讲一个新东西 yield
. yield是ES6的新关键字,使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的return关键字。
. yield关键字实际返回一个IteratorResult(迭代器)对象,它有两个属性,value和done,分别代表返回值和是否完成。
. yield无法单独工作,需要配合generator(生成器)的其他函数,如next,懒汉式操作,展现强大的主动控制特性。
用 yield自定义一个迭代器
function*(){}这种函数名字叫 generator函数,生成器函数,下一篇再重点讲这个哈.
文章到此结束,希望我们对于iterator和什么是迭代器 iterator的问题能够给您带来一些启发和解决方案。如果您需要更多信息或者有其他问题,请随时联系我们。