(1)每种容器类型都定义了自己的迭代器类型,如vector:
//这条语句定义了一个名为iter的变量,它的数据类型是由vector<int>定义的iterator类型 vector<int>::iterator iter;(2)使用迭代器读取vector的每一个元素
vector<int> ivec(10, 1); for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter) { *iter = 2; } //const_iterator //只能读取容器中的元素,而不能修改 for (vector<int>::const_iterator citer = ivec.begin(); citer != ivec.end(); citer++) { cout << *citer; // error; // *citer = 3 ; }vector::const_iterator和const vector::iterator的区别,前者不能修改所指向容器内的元素,后者是自身不能改变,也就是在初始化后就不能指向其它元素了。 (3)iterator的算术操作: iterator除了进行++,–操作,可以将iter+n,iter-n赋值给一个另一个iterator对象。还可以使用一个iterator减去另外一个iterator。
const vector<int>::iterator newiter = ivec.begin(); vector<int>::iterator newiter2 = ivec.end(); cout << "\n" << newiter2-newiter;一个典型的vector的STL程序:
#include <iostream> using namespace std; int main (int argc, char *argv[]) { std::vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); for (vector<int>::iterator iter = v.begin(); iter != v.end(); ++iter) { cout << *iter << endl; } return 0; }Iterator(迭代器)模式又称Cursor(游标)模式,用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。或者这样说可能更容易理解:Iterator模式是运用于聚合对象的一种模式,通过运用该模式,使得我们可以在不知道对象内部表示的情况下,按照一定顺序(由iterator提供的方法)访问聚合对象中的各个元素。 由于Iterator模式的以上特性:与聚合对象耦合,在一定程度上限制了它的广泛运用,一般仅用于底层聚合支持类,如STL的list、vector、stack等容器类及ostream_iterator等扩展iterator。 根据STL中的分类,iterator包括:
iterator说明Input Iterator只能单步向前迭代元素,不允许修改由该类迭代器引用的元素Output Iterator该类迭代器和Input Iterator极其相似,也只能单步向前迭代元素,不同的是该类迭代器对元素只有写的权利Forward Iterator该类迭代器可以在一个正确的区间中进行读写操作,它拥有Input Iterator的所有特性,和Output Iterator的部分特性,以及单步向前迭代元素的能力Bidirectional Iterator该类迭代器是在Forward Iterator的基础上提供了单步向后迭代元素的能力Random Access Iterator该类迭代器能完成上面所有迭代器的工作,它自己独有的特性就是可以像指针那样进行算术计算,而不是仅仅只有单步向前或向后迭代vector和deque提供的是RandomAccessIterator,list提供的是BidirectionalIterator,set和map提供的是ForwardIterator,关于STL中iterator迭代器的操作如下: 1、所有迭代器
操作说明p++后置自增迭代器++p前置自增迭代器2、输入迭代器
操作说明*p复引用迭代器,作为右值p=p1将一个迭代器赋给另一个迭代器p==p1比较迭代器的相等性p!=p1比较迭代器的不等性3、输出迭代器
操作说明*p复引用迭代器,作为左值p=p1将一个迭代器赋给另一个迭代器4、正向迭代器 提供输入输出迭代器的左右功能。
5、双向迭代器
操作说明p–后置自减迭代器–p前置自减迭代器6、随机迭代器
操作说明p+=i将迭代器递增i位p-=i将迭代器递减i位p+i在p位后加i位后的迭代器p-i在p位后减i位后的迭代器p[i]返回p位元素偏离i位的元素引用p如果迭代器p的位置在p1前,返回true,否则返回falsep<=p1p的位置在p1的前面或同一位置时返回true,否则返回falsep>p1如果迭代器p的位置在p1后,返回true,否则返回falsep>=p1p的位置在p1的后面或同一位置时返回true,否则返回false只有顺序容器和关联容易支持迭代器遍历,各容器支持的迭代器的类别如下:
容器支持的迭代器类别容器支持的迭代器类别vector随机访问deque随机访问set双向multiset双向multimap双向stack不支持list双向map双向queue不支持priority_queue不支持Iterator模式有三个重要的作用:
1.它支持以不同的方式遍历一个聚合.复杂的聚合可用多种方式进行遍历,如二叉树的遍历,可以采用前序、中序或后序遍历。迭代器模式使得改变遍历算法变得很容易: 仅需用一个不同的迭代器的实例代替原先的实例即可,你也可以自己定义迭代器的子类以支持新的遍历,或者可以在遍历中增加一些逻辑,如有条件的遍历等。 2. 迭代器简化了聚合的接口. 有了迭代器的遍历接口,聚合本身就不再需要类似的遍历接口了,这样就简化了聚合的接口。 3. 在同一个聚合上可以有多个遍历 每个迭代器保持它自己的遍历状态,因此你可以同时进行多个遍历。
此外,Iterator模式可以为遍历不同的聚合结构(需拥有相同的基类)提供一个统一的接口,即支持多态迭代。