插入迭代器适配器,又被称为插入迭代器或插入器(往后统一“插入迭代器”命名),故名思意,就是使用迭代器插入元素。一般我们都是通过迭代器读改元素,比如我要读改一个元素(it为非可读迭代器,假设*it数据类型为Int):
*it = 0;//改 cout << *it;//读
而使用插入迭代器时:
*it = 0;//插入一个元素
插入迭代器原则上能够进行3种插入方式:front_insert_iterator(头插)、back_insert_iterator(尾插)和insert_iterator(指定位置插入)但实际取决于容器能否支持该插入方式,比如vector容器或forward_list容器没有push_front(),你总不能通过头插迭代器操作吧,可以通过迭代器前移(即++迭代器)实现多个插入。值得注意的是这三种插入迭代器属于前向迭代器,只能++不能--,迭代器无法进行回退。下面我们通过插入迭代器为list容器分别进行头插、尾插和指定位置插入元素。
#include<iostream>
#include<iterator>//必须包含!
#include<list>
/*插入迭代器*/
using namespace std;
void test()
{
list<int> l{1,2,3,4,5};
/*front_insert_iterator*/
front_insert_iterator<list<int>> fii(l);
cout << "头插一个0、-1后遍历容器:【";
*fii=0;
++fii;
*fii=-1;
for(list<int>::iterator it = l.begin();it!=l.end();++it)cout << *it << " ";
cout << "】\n";
/*back_insert_iterator*/
back_insert_iterator<list<int>> bii(l);
cout << "尾插一个6、7后遍历容器:【";
*bii=6;
++bii;
*bii=7;
for(list<int>::iterator it = l.begin();it!=l.end();++it)cout << *it << " ";
cout << "】\n";
/*insert_iterator*/
/*指定位置插入*/
list<int>::iterator pos3 = l.begin();
for(int i=0;i<4;++i)++pos3;//找到3的位置
insert_iterator<list<int>> ii(l,pos3);
cout << "3前面插入一个9后遍历容器:【";
*ii=9;
for(list<int>::iterator it = l.begin();it!=l.end();++it)cout << *it << " ";
cout << "】\n";
}
int main(){
test();
return 0;
}编译结果如下:

可以看到输出完全符合我们的指令!
学习完插入迭代器后,读者是否感觉其创建方式比较繁琐?其实我们还可以通过适配函数来实现简化步骤。就上面代码作例子,比如我们要创建一个指定位置插入迭代器:
insert_iterator<list<int>> ii(l,pos3);
我们就可以使用适配函数:
auto ii = inster(l,pos3);//这里是适配函数辅助auto推导实现省略insert_iterator<list<int>>
适配函数有三种:front_inster()、back()_inster和inster(),分别对应头插、尾插和指定位置插入,可以清晰地发现函数名后缀上了”er“表示名词,所以对比起来也好记。这里就不过多演示适配函数的实际操作了,其核心原理就是利用适配函数辅助auto自动推导实现代码简化的效果。
总结:本节我们主要学习了三种插入迭代器的具体使用方式,以及对应适配函数的实际操作方法,能够对容器(依赖于容器性质,是否支持头插、尾插或指定位置插入)进行元素插入。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程