C++迭代器iterator

来源:互联网 发布:淘宝代练可靠吗 编辑:程序博客网 时间:2024/06/11 05:49

1、迭代器(iterator)是一种检查容器内元素并遍历元素的数据类型

(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;}

2、Iterator(迭代器)模式

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,否则返回false p<=p1 p的位置在p1的前面或同一位置时返回true,否则返回false p>p1 如果迭代器p的位置在p1后,返回true,否则返回false p>=p1 p的位置在p1的后面或同一位置时返回true,否则返回false

只有顺序容器和关联容易支持迭代器遍历,各容器支持的迭代器的类别如下:

容器 支持的迭代器类别 容器 支持的迭代器类别 vector 随机访问 deque 随机访问 set 双向 multiset 双向 multimap 双向 stack 不支持 list 双向 map 双向 queue 不支持 priority_queue 不支持

3、应用

Iterator模式有三个重要的作用:

1.它支持以不同的方式遍历一个聚合.复杂的聚合可用多种方式进行遍历,如二叉树的遍历,可以采用前序、中序或后序遍历。迭代器模式使得改变遍历算法变得很容易: 仅需用一个不同的迭代器的实例代替原先的实例即可,你也可以自己定义迭代器的子类以支持新的遍历,或者可以在遍历中增加一些逻辑,如有条件的遍历等。
2. 迭代器简化了聚合的接口. 有了迭代器的遍历接口,聚合本身就不再需要类似的遍历接口了,这样就简化了聚合的接口。
3. 在同一个聚合上可以有多个遍历 每个迭代器保持它自己的遍历状态,因此你可以同时进行多个遍历。

此外,Iterator模式可以为遍历不同的聚合结构(需拥有相同的基类)提供一个统一的接口,即支持多态迭代。

0 0
原创粉丝点击