c++ 迭代器能修改其值吗_CPP迭代器升级详解

36624e04bb3eaf1ebdf8f4cc226641ad.png

迭代器

迭代器是一种检查容器内元素并遍历元素的数据类型。

作用

迭代器提供了一个容器中的对象的访问方法,并且定义了容器中对象的范围。

迭代器模式

Iterator模式又称Cursor(游标)模式,用于提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露改对象的内部表示。详参C++迭代器 iterator - chao_yu - 博客园C++迭代器 iterator - chao_yu - 博客园

迭代器的5大类型

23409f6ade9ddc2819db715b72813a89.png

1.前向迭代器:p++/++p

注:可以再一个正确的区间内进行读写操作。

2.双向迭代器:p--/--p

注:在前向迭代器的基础上,提供了单步向后迭代元素的能力。

3.输入迭代器:*p/p=p1/p==p1/p!=p1

注:只能单步向前迭代元素,不允许修改由该类迭代器引用的元素。

4.输出迭代器:*p/p=p1/正向迭代器

注:该类迭代器只能单步向前迭代元素,只允许对元素有写的能力。

5.随机迭代器:p+=i/p-=i/p+i/p-i/p[i]/pp1/p>=p1

注:该类迭代器能完成以上所有迭代器的工作,他有独自的特性就是可以像指针那样进行算数计算,而不是仅仅只有单步向前或向后迭代。

迭代器的应用

1.支持一一个不同的方式遍历一个聚合(容器),且复杂的聚合可用多种方式进行遍历。如二叉树的前序遍历、中序遍历和后序遍历,以及有条件的遍历等。

2.迭代器简化了聚合的接口,有了迭代器的遍历接口,聚合本身就不再需要类似的遍历接口了。

3.在同一个聚合(容器)上可以有多个遍历,每一个迭代器都保持他自己的遍历状态,因此你可以同时进行多个遍历。

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

迭代器的缺点

与集合密切相关限制了Iterator模式的广泛使用。

迭代器和指针

  1. 迭代器是指针的泛化,它允许程序员用相同的方式处理不同的数据结构(容器)。
  2. 迭代器类似C语言中的指针类型,它提供了对对象的间接访问。
  3. 指针是C语言中的知识,而在C++中特定的迭代器。指针灵活,迭代器功能丰富。
  4. 迭代器提供了一个对容器对象或者string对象的访问方法,并定义了一个范围。
  5. 每个容器定义了一种名为iterator的类型,这种类型支持迭代器的各种行为。

常用的迭代器类型

62e01484921f63786428861f3ac8b6ef.png

输出迭代器

输出迭代器只用于写一个序列,他可以进行递增和提取操作。

实例:

//输出迭代器实例#include#includeusing namespace std;void main(){vector IV;for (int i = 0; i < 10; i += 2)IV.push_back(i);vector::iterator it = IV.begin();cout << "vector:" << endl;while (it != IV.end())cout << *it++ << endl;system("pause");}

结果为:

c5b313557a5e80d80f34ba4cad76abe6.png

输入迭代器

输入迭代器只用于读一个序列,他可以进行递增、提取和比较操作。

实例:

#include#includeusing namespace std;void main(){vector IV(5);vector::iterator out = IV.begin();*out++ = 1;*out++ = 2;*out++ = 3;*out++ = 4;*out++ = 5;vector::iterator IE = IV.begin();while (IE != IV.end()){cout << *IE++ << endl;}system("pause");}

结果为:

515b18051b9fa388dd2ceade689203d9.png

前向迭代器

前向迭代器既可用于读,又可用于写。他不仅具有输入和输出迭代器的功能,还具有 保存其值的功能,从而能够从迭代器原来的位置开始重新遍历序列。

实例:

//前向迭代器实例#include#includeusing namespace std;void main(){vector IV(5);vector::iterator it = IV.begin();vector::iterator ie = it;*it++ = 11;*it++ = 12;*it++ = 13;*it++ = 14;*it = 8;cout << "vector-forward" << endl;while (ie != IV.end())cout << *ie++ << ' ';cout << endl;system("pause");}

结果为:

b8db5b25f60fe18226a368dfcb3c62ba.png

双向迭代器

双向迭代器既可以读,又可以写,与前向迭代器类似,知识双向迭代器可作递增和递减操作。

实例:

//双向迭代器应用实例#include#includeusing namespace std;void main(){vector IV(5);vector::iterator it = IV.begin();vector::iterator ie = it;*it++ = 1;*it++ = 2;*it++ = 3;*it++ = 4;*it = 9;cout << "vector-Bidirectional Iterator";while (ie != IV.end()) //此处不加分号; while循环//向后迭代输出cout << *ie++ << endl;//向前迭代输出docout << *--ie << endl;while (ie != IV.begin()); //此处一定要加分号; do while循环cout << endl;system("pause");}

结果为:

1d66a3afacd18b58cb19501793406c49.png

随机访问迭代器

随机访问迭代器是最强大的迭代器类型,不仅具有双向迭代器的所有功能,还能使用指针的算术运算和所有比较运算。

实例:

#include#includeusing namespace std;void main(){vector IV(5);vector::iterator it = IV.begin();*it++ = 1; //容器添加值*it++ = 2; //容器添加值*it++ = 3; //容器添加值*it++ = 4; //容器添加值*it = 9;cout << "vector-old:";for (it = IV.begin(); it != IV.end(); it++)cout << *it << ' ';it = IV.begin();*(it + 2) = 100;cout << endl;cout << "vector-random:";for (it = IV.begin(); it != IV.end(); it++)cout << *it << ' ';cout << endl;system("pause");}

结果为:

124f975b309a182f2c2245695abaf00a.png

心得

迭代器是访问容器中的元素,算法是对容器中的元素进行操作。每种容器都有各自的特点,只有熟练掌握这些特点才能将标准模板库的作用充分发挥,并且应尽可能多的使用标准模板库提供的算法,这样可以节省许多开发时间。

本文部分内容来源于网络,如有错误,敬请指正,如有侵权,请联系修改,如有疑问,可留言讨论,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值