插入迭代器适配器(insert_iterator),简称插入迭代器或者插入器,其功能就是向指定容器中插入元素。值得一提的是,根据插入位置的不同,C++ STL 标准库提供了 3 种插入迭代器:
迭代器适配器 | 功能 |
---|---|
back_insert_iterator | 在指定容器的尾部插入新元素,但前提必须是提供有 push_back() 成员方法的容器(包括 vector、deque 和 list)。 |
front_insert_iterator | 在指定容器的头部插入新元素,但前提必须是提供有 push_front() 成员方法的容器(包括 list、deque 和 forward_list)。 |
insert_iterator | 在容器的指定位置之前插入新元素,前提是该容器必须提供有 insert() 成员方法。 |
本文作者原创,转载请附上文章出处与本文链接。
C++ STL insert_iterator插入迭代器适配器(深入了解,一文学会)目录
1 back_insert_iterator迭代器
back_insert_iterator 迭代器可用于在指定容器的末尾处添加新元素。
需要注意的是,由于此类型迭代器的底层实现需要调用指定容器的 push_back() 成员方法,这就意味着,此类型迭代器并不适用于 STL 标准库中所有的容器,它只适用于包含 push_back() 成员方法的容器。
C++ STL 标准库中,提供有 push_back() 成员方法的容器包括 vector、deque 和 list。
1.1 back_insert_iterator迭代器创建
#include <iterator>
using namespace std;
//Container 用于指定插入的目标容器的类型;container 用于指定具体的目标容器。
//back_insert_iterator<Container> back_it(container);
//创建一个 vector 容器
vector<int> foo;
//创建一个可向 foo 容器尾部添加新元素的迭代器
back_insert_iterator< vector<int> > back_it(foo);
1.2 back_insert_iterator迭代器示例
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
//创建一个 vector 容器
vector<int> foo;
//创建一个可向 foo 容器尾部添加新元素的迭代器
back_insert_iterator< vector<int> > back_it(foo);
//将 5 插入到 foo 的末尾
back_it = 5;
//将 4 插入到当前 foo 的末尾
back_it = 4;
//将 3 插入到当前 foo 的末尾
back_it = 3;
//将 6 插入到当前 foo 的末尾
back_it = 6;
//输出 foo 容器中的元素
for (vector<int>::iterator it = foo.begin(); it != foo.end(); ++it)
cout << *it << ' ';
通过借助赋值运算符,我们依次将 5、4、3、6 插入到 foo 容器中的末尾。这里需要明确的是,每次插入新元素时,该元素都会插入到当前 foo 容器的末尾。换句话说,程序中每个赋值语句,都可以分解为以下这 2 行代码:
//pos表示指向容器尾部的迭代器,value 表示要插入的元素
pos = foo.insert(pos,value);
++pos;
2 front_insert_iterator迭代器
和 back_insert_iterator 正好相反,front_insert_iterator 迭代器的功能是向目标容器的头部插入新元素。
并且,由于此类型迭代器的底层实现需要借助目标容器的 push_front() 成员方法,这意味着,只有包含 push_front() 成员方法的容器才能使用该类型迭代器。
C++ STL 标准库中,提供有 push_front() 成员方法的容器,仅有 deque、list 和 forward_list。
#include <iostream>
#include <iterator>
#include <forward_list>
using namespace std;
//创建一个 forward_list 容器
forward_list<int> foo;
//创建一个前插入迭代器
//front_insert_iterator< forward_list<int> > front_it(foo);
front_insert_iterator< forward_list<int> > front_it = front_inserter(foo);
//向 foo 容器的头部插入元素
front_it = 5;
front_it = 4;
front_it = 3;
front_it = 6;
for (forward_list<int>::iterator it = foo.begin(); it != foo.end(); ++it)
cout << *it << ' ';
3 insert_iterator迭代器
当需要向容器的任意位置插入元素时,就可以使用 insert_iterator 类型的迭代器。
需要说明的是,该类型迭代器的底层实现,需要调用目标容器的 insert() 成员方法。但幸运的是,STL 标准库中所有容器都提供有 insert() 成员方法,因此 insert_iterator 是唯一可用于关联式容器的插入迭代器。
定义 insert_iterator 类型迭代器的语法格式如下:
std::insert_iterator<Container> insert_it (container,it);
其中,Container 表示目标容器的类型,参数 container 表示目标容器,而 it 是一个基础迭代器,表示新元素的插入位置。
#include <iostream>
#include <iterator>
#include <list>
using namespace std;
//初始化为 {5,5}
list<int> foo(2, 5);
//定义一个基础迭代器,用于指定要插入新元素的位置
list<int>::iterator it = ++foo.begin();
//创建一个 insert_iterator 迭代器
//insert_iterator< list<int> > insert_it(foo, it);
insert_iterator< list<int> > insert_it = inserter(foo, it);
//向 foo 容器中插入元素
insert_it = 1;
insert_it = 2;
insert_it = 3;
insert_it = 4;
//输出 foo 容器存储的元素
for (list<int>::iterator it = foo.begin(); it != foo.end(); ++it)
cout << *it << ' ';
需要注意的是,如果 insert_iterator 迭代器的目标容器为关联式容器,由于该类型容器内部会自行对存储的元素进行排序,因此我们指定的插入位置只起到一个提示的作用,即帮助关联式容器从指定位置开始,搜索正确的插入位置。但是,如果提示位置不正确,会使的插入操作的效率更加糟糕。
以下博客部分内容借鉴自:http://c.biancheng.net/stl/。
C++ STL 容器、迭代器、适配器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/120052137 C++ STL deque容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/118676574
C++ STL vector容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/118676109
C++ STL list容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/118676917
C++ STL forward_list容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/118687348
C++ STL array 容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/118688364
C++ STL pair 类模板(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/118714852
C++ STL map容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/118741670
C++ STL map emplace()和emplace_hint()(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/118771777
C++ STL multimap容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/118773021
C++ STL Set容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/118918940
C++ STL multiset容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119624779
C++ STL unordered_map容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119689199
C++ STL unordered_set容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119709019
C++ STL unordered_multiset容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119709079
C++ STL stack容器适配器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119723782
C++ STL queue容器适配器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119746246
C++ STL priority_queue容器适配器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119770527
C++ STL reverse_iterator反向迭代器适配器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119814820
C++ STL insert_iterator插入迭代器适配器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119834378
C++ STL stream_iterator流迭代器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119834429
C++ STL streambuf_iterator流缓冲区迭代器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119850048
C++ STL move_iterator移动迭代器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119859888
C++ STL advance()函数(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/120008250
C++ STL distance()函数(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/120008300
C++ STL iterator迭代器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/120008346
C++ STL const_iterator转换为iterator类型迭代器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/120008324
C++ STL begin()和end()函数(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/120008459
C++ STL prev()和next()函数(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/120008481