插入迭代器,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()。
参考:
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之分。