迭代器(Iterator)详解
本篇文章将对迭代器(Iterator)从四个方面进行详解。
1. 是什么
迭代器(Iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址[1]。
通俗点说,迭代器表现的像指针,读取集合或者数组中的一个值,读完以后又指向下一条数据,一个个数过去。
2. 为什么
我们知道,数据容器很多,有数组、链表、树等等,对数据容器中的元素进行遍历也对应的有各自的方法。设想一下,如果我们要为数组和集合设计查找算法,因为找下一个元素在数组和集合中的操作不同,只是为了查找。核心思想是寻找下一个元素,但要实现两套不同的代码,显然这是不优秀的。
有了迭代器,我们可以将算法和特定的容器分离开来。它可以遍历并选择序列中的对象,而我们不需要了解该序列的底层结构。也就是说功能代码我们只需要实现一套就行。比如要实现查找,那么代码实现后只要对迭代器适用就行了,不用考虑不同的容器之间你的功能代码的底层实现。
3.怎么用
迭代器的类型有很多,譬如单向、双向等等。但核心功能是差不多的,当需要追求某一特定容器时可选用更特殊的迭代器。
例如Java 中的Iterator ,功能比较简单,并且只能单向移动:
(1) 使用方法iterator() 要求容器返回一个Iterator 。第一次调用Iterator 的next() 方法时,它返回序列的第一个元素。注意:iterator() 方法是java.lang.Iterable 接口,被 Collection 继承。
(2) 使用next() 获得序列中的下一个元素。
(3) 使用hasNext() 检查序列中是否还有元素。
(4) 使用remove() 将迭代器新返回的元素删除。
Iterator 是 Java 迭代器最简单的实现,为 List设计的 ListIterator 具有更多的功能,它可以从两个方向遍历List ,也可以从List 中插入和删除元素。
4.注意
1.在迭代器迭代元素的过程中,不允许使用集合对象改变集合中的元素个数,如果需要添加或者删除只能使用迭代器的方法操作。
2.如果使用了集合对象改变集合中的元素个数那么就会报错:不改变个数即可,替换也可以的。
3.迭代器的生存周期为创建到使用结束的时段。
4. foreach : Iterator 的封装变形,变得比 Iterator更简单。但是他也需要知道数组或集合的类型。并且,Iterator 需要注意的,foreach 同样需要注意。
参考资料:
[1] https://baike.baidu.com/item/%E8%BF%AD%E4%BB%A3%E5%99%A8/3803342?fr=aladdin迭代器_百度百科