接触迭代器主要是在接触和使用STL时候开始的。作为泛型编程的良好实践,STL的迭代器有着非常显著的代表性。
最初,我并不了解迭代器的作用,甚至一直很排斥使用它。但随着逐步开始了解STL,慢慢开始了解了迭代器的意义以及重要性。本文主要是就自己所学所了解做一个简单的整理。本文内容参考整理自《泛型编程与STL》。
一、迭代器的重要性
迭代器,又称作泛型指针。顾名思义,迭代器就是模仿指针来实现的。有些情况,它就是指针。比方说vector,由于它使用的是一整块连续空间,所以直接拿其指针就可以作为随机迭代器使用,是非常强力的。
那么为什么我们不直接用指针,而一定要弄一个迭代器出来呢?
因为它是数据结构与算法之间的重要接口。以STL中的算法find为例,它要求可以遍历某个数据结构并读取其中元素的值。如果我们只提供指针给它,那么它针对vector要写一个算法,针对list链表又要重新写一个算法。而实际上,算法对这两种数据结构的要求是相同的:按某个线性顺序遍历并读取元素。因此我们可以把vector和list的遍历的这种特性抽象出来,做成迭代器,这样算法就可以保证它的通用性和简洁性、有效性。对于vector的抽象很简单,只需要把其指针拿出来直接用即可。但对于list,我们就需要在iterator类中对++操作、*操作进行运算符重载,以模仿指针行为。
对于不同的数据结构,迭代器的复杂程度是截然不同的,而能实现的功能也是不同的。与此同时,我们也要注意到不同的算法对迭代器的要求也是不同的。因此,我们要了解迭代器的分类,以及不同的迭代器和什么样的算法是匹配的,这样才能准确的使用STL库,甚至设计自己的迭代器。
二、迭代器的分类
迭代器总的来说,主要有五种不同的迭代器类别:Input Iterator,Output Iterator,Forward Iterator,Bidirectional Iterator,Random Access Iterator