插入迭代器
插入迭代器(Inserts)也是一种适配器,简称插入器,带有一个容器参数,并生成一个迭代器,用于在指定容器中插入元素。通过插入迭代器赋值时,迭代器将会插入一个新元素,而不会将原有的元素覆盖。STL提供了三个插入迭代器,如下所示:
● back_insert_iterator<C>:在容器末端插入数据,其内部调用的是push_back()函数,因此,只有在提供push_back()函数的容器中才能使用,例如vector、deque、list。
● front_insert_iterator<C>:在容器前端插入数据,其内部调用的是push_front()函数,将元素插入容器最前端,因此只有在提供push_front()函数的容器中才能使用,例如deque、list,而vector容器就不再适用。要注意的是,前向插入器在插入多个元素时,是以逆序方式插入的,因为它总是将后一个元素插入到前一个元素的前面。
● insert_iterator<C>:在容器的指定位置插入数据,其实参所表示的位置前插入元素,其内部调用的是insert()函数,所有的容器都提供了insert()成员函数,因此它适用于所有的容器,也是唯一可用于关联容器上的插入迭代器,但对关联容器来说,待插入位置只是一个提示,元素的真正位置要根据其实值或键值而定,如果提示位置不当,则可能会更糟糕。
为了方便构造插入器,在标准中还预设了三个助手函数模板:back_inserter()、front_inserter()和
inserter()函数。插入迭代器的典型用法是与标准算法copy()结合,将原本是复制数据的算法改为向容器中插入数据。为了让读者更好的理解插入器的使用,接下来我们通过一个案例来演示其用法,具体如例1所示。
例1
1 #include <iostream>
2 #include <deque>
3 #include <algorithm>
4 #include <iterator>
5 using namespace std;
6
7 int main()
8 {
9 int arr[] = { 1, 2, 3, 4, 5, 6 };
10 deque<int> d1; //创建一个空的deque<int>对象
11 cout << "d1(1): ";
12 copy(arr, arr + 6, back_inserter(d1)); //将数组arr中的元素插入到d1容器中
13 //将d1容器中的元素用输出流迭代器输出到屏幕
14 copy(d1.begin(), d1.end(), ostream_iterator<int>(cout, " "));
15 cout << endl;
16
17 cout << "d1(2): ";
18 front_inserter(d1) = 11; //前端插入元素
19 front_inserter(d1) = 22;
20 copy(d1.begin(), d1.end(), ostream_iterator<int>(cout, " ")); //再次输入
21 cout << endl;
22
23 cout << "d1(3): ";
24 //将d1容器中的所有元素再次插入到d1容器的前端
25 copy(d1.begin(), d1.end(), front_inserter(d1));
26 copy(d1.begin(), d1.end(), ostream_iterator<int>(cout, " "));
27 cout << endl;
28
29 cout << "d1(4): ";
30 inserter(d1, d1.end()) = 33; //将33插入在d1容器的尾部
31 inserter(d1, d1.end()) = 44;
32 copy(d1.begin(), d1.end(), ostream_iterator<int>(cout, " "));
33 cout << endl;
34
35 deque<int> d2; //创建一个空的deque容器d2
36 cout << "d2: ";
37 //将d1容器的元素插入到d2容器的头部
38 copy(d1.begin(), d1.end(), inserter(d2, d2.begin()));
39 copy(d2.begin(), d2.end(), ostream_iterator<int>(cout, " "));
40 cout << endl;
41 system("pause");
42 return 0;
43 }
运行结果如图1所示。
![](uploads/course/images/c/2.8/clip_image002-1593166614061.jpg)
图1 例1运行结果
在例1中,代码第9行定义了一个int型数组,第10行定义了一个空的deque<int>容器,第12代码调用copy()函数将数组中的元素从尾部插入到d1容器中,第13行代码,调用copy()函数(copy()函数将在算法中讲解)用输出流迭代器将d1容器中的元素输出到屏幕,由图1可知,数组中的元素成功插入到了d1容器。
第17-22行代码是从d1容器前端插入11与22两个元素并输出,由图8-19可知,成功将两个元素插入到头部(d1(2)行的输出)。
第23-27行代码是将d1容器中的元素再次插入d1容器中的前端并输出,由图8-19可知,元素整体插入成功,且是逆序插入的(d1(3)行输出)。
第29-33行是调用inserter()函数在d1容器尾部插入33与44两个元素,由图8-19可知,元素成功插入(d1(4)行的输出)。
第35-40行,35行代码又创建了一个deque<int>容器d2,然后38代码利用inserter()函数将d1容器中的元素插入到d2容器中,由图8-19可知,d1容器中的元素成功插入到d2容器中,与d1容器中的元素输出相同。