再谈迭代器
来源:互联网 发布:甲醛有味道吗 知乎 编辑:程序博客网 时间:2024/05/18 20:08
除了前面所描述的普通迭代器。c++语言还提供了另三种迭代器:
1、插入迭代器:insert iterator,与容器绑定在一起,实现在容器中插入元素的功能。
2、iostream迭代器:与输入或输出流绑定在一起,用于迭代器遍历所关联的IO流。
3、反向迭代器:reverse iterator,与普通迭代器相对,实现反向遍历,也就是从后向前遍历。所有的容器都定义了reverse_iterator类型。
上述迭代器都在iterator头文件中定义。
插入迭代器
插入迭代器是一种迭代器适配器,带有一个容器对象参数,并生成一个迭代器,用于在指定位置插入元素。通过插入迭代器赋值时,迭代器将会插入一个新的元素。至于在什么位置插入,则分别由三种迭代器实现:
1、back_inserter:创建使用push_back实现插入的迭代器。
2、front_inserter:创建使用push_front实现插入的迭代器。
3、inserter:使用insert实现插入操作。带有第二个实参:指向插入起始位置的迭代器。
注意:
1、front_inserter只有在提供push_front操作的容器上使用,才有效果。如vector则无法使用,如强行使用,则导致编译错误。
2、使用inserter插入元素时,将在指定位置之前进行插入。
举个例子:
原始序列ilist:1,2,3,4,5
原始序列ivec:1,2,3
ilist<int>::iterator it=find(ivec.begin(),ivec.end(),5);//it指向5
replace(ivec.begin(),ivec.end(),inserter(ilist,it),1,2);
以上代码执行了:
首先获取ilist中指向5的迭代器,然后使用replace将ivec中的1替换成2,将替换后的结果,插入到ilist中的5之前。
结果为:
ilist:1,2,3,4,2,2,3,5
ivec:1,2,3
iostream迭代器
虽然iostream类型不是容器,但标准库同样提供了再iostream对象上使用的迭代器。
istream_iterator用于读取输入流,而ostream_iterator用于写输出流。
构造函数
1、istream_iterator<T> in(strm);创建从输入流中读取T类型对象的迭代器
例如:istream_iterator<int> in_iter(cin);
2、istream_iterator<T> in;创建超出末端的迭代器,常用于结束流迭代器
例如:istream_iterator<int> end_iter;
3、ostream_iterator<T> out(strm);创建将T类型的对象写入到流strm中的迭代器
例如:ostream_iterator<int> out_iter(cout);
4、ostream_iterator<T> out(strm,delim);创建将T类型的对象写入到流strm中的迭代器,在写入过程中使用delim作为元素的分隔符。delim是以空字符结束的字符数组
例如:ostream_iterator<int> out_iter(cout,"/n");
流迭代器定义了最基本的迭代器操作:自增、解引用和赋值。
另外istream迭代器可进行比较操作,而ostream则不支持。
看一个综合应用:
vector<int> ivec;
istream_iterator<int> in_iter(cin),end_iter;
while(in_iter!=end_iter)
ivec.push_back(*in_iter++);
ostream_iterator<int> out_iter(cout,"/n");
vector<int>::iterator iter=ivec.begin();
for(;iter!=ivec.end();++iter)
*out_iter++=*iter;
以上应用首先创建了两个istream_iterator迭代器,一个用于读取cin的数据,另一个作为结束标记。接着向ivec中插入从cin中读取的数据。然后创建了ostream_iterator迭代器,用于向ostream中写入数据,而写入的数据则由vector的迭代器获取,最后实现输出。
使用用流迭代器的注意点:
1、凡是提供了输入操作符>>的任何类型都可以创建istream_iterator迭代器。任何提供了输出操作符<<的类型可以创建ostream_iterator迭代器。
2、不可能从ostream_iterator中读取,也不可能向istream_iterator写入
3、ostream_iterator没有->操作符。
反向迭代器
是一种反向遍历的迭代器,与普通迭代器相对。也就是说,使用反向迭代器,是从最后一个元素到第一个元素的遍历。对于反向迭代器来说,++相当于访问前一个元素,--相当于访问下一个元素。
容器不仅仅定义了begin和end成员,还定义了rbegin和rend成员,分别指向容器的尾元素和首元素的前一位置。
- 再谈迭代器
- 再谈迭代器
- 再谈迭代器
- 再谈迭代器C++ Primer 11.3
- c++学习笔记(七):再谈迭代器
- C++(17)STL实践与分析之再谈迭代器
- 再谈迭代器,生成器,yield,及和类的使用
- C++ Primer 学习笔记_42_STL实践与分析(16)–再谈迭代器【上】
- C++ Primer 学习笔记_43_STL实践与分析(17)--再谈迭代器【中】
- C++ Primer 学习笔记_44_STL实践与分析(18)--再谈迭代器【下】
- Trace/BPT trap: 一种可能的解决方法
- 没有找到cxcore100.dll,因此这个应用程序未能启动,重新安装应用程序可能会修复此问题
- 字符编码详解及由来(UNICODE,UTF-8,GBK)[转]
- Axis2 的 RPC 和 AXIOM 服务端方法的两种调用方式
- C#开发的辅助工具介绍
- 再谈迭代器
- 服务器超出最大允许连接数
- 获取系统时间 精确到毫秒 iphone
- java 问题解惑
- HDU 2254(数论,矩阵)
- java 一些算法题目
- mysql 外键的添加与删除
- Hibernate性能优化技巧
- 看企业们创新的iPad运用