学科分类
目录
C++基础

插入迭代器

插入迭代器(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容器中的元素输出相同。

点击此处
隐藏目录