三种不一般的迭代器(插入迭代器,iostream迭代器和反向迭代器)

插入迭代器,iostream迭代器和反向迭代器都是迭代器的补充,是一种迭代器适配器,是一种泛型算法,不属于特定容器。

插入迭代器

back_interter

调用容器的push_back()

front_interter

调用容器的push_front()

inserter

调用容器的c.insert(val, it)

inserter的一个有意思地方

0.先看支持操作

1.首先绑定容器

auto it = inserter(c, iter); //绑定容器。it是插入型迭代器
*it = val; //在c的iter前插入

2.等价于下列操作,此it和上面it不是一个类型的

auto it = c.insert(it, val);  //it是普通迭代器
++it;  

3.实例分析

list<int> lst = {1,2,3,4};
list<int> lst2, lst3;

copy(lst.cbegin(), lst.cend(), front_inserter(lst2));  //lst2为4,3,2,1

copy(lst.cbegin(), lst.cend(), inserter(lst3, lst3.end())); //lst3为1,2,3,4

解释:

使用front_inserter时,一插入新元素,it自动指向新元素。

使用inserter时,一插入新元素,it是指向新元素的下一个元素,就是一直在lst3的end()。

参考:

C++之inserter函数与插入迭代器

iostream迭代器

istream_iterator

istream_iterator<int> int_it(cin);
istream_iterator<int> int_eof;   //默认构造,当尾后迭代器,即end()

ostream_iterator

ostream_iterator<int> out_it(cout);

ostream_iterator的一个有意思之处

1.先看支持的操作,可能会想out是个指针,写入不得*out才是cout对象。其实想支持啥只要类有此定义就行,不用太钻牛角尖

2.实例对比。原因就是*和++没改变out_iter指向。

ostream_iterator<int> out_it(cout,' ');
for(auto e:vec)
    *out_iter++ = e;   //看着很舒服
cout<<endl;


ostream_iterator<int> out_it(cout,' ');
for(auto e:vec)
    out_iter = e;   //一样的效果
cout<<endl;

反向迭代器

只有forward_list没有反向迭代器。反向迭代器也有const和非const之分。

 

猜你喜欢

转载自blog.csdn.net/asdfghwunai/article/details/89279847