再谈迭代器

来源:互联网 发布:甲醛有味道吗 知乎 编辑:程序博客网 时间: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成员,分别指向容器的尾元素和首元素的前一位置。

原创粉丝点击