C++ STL insert_iterator插入迭代器适配器(深入了解,一文学会)

        插入迭代器适配器(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迭代器

1.1 back_insert_iterator迭代器创建

1.2 back_insert_iterator迭代器示例

 2 front_insert_iterator迭代器

3 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
 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
insert_iteratorSTL库中的一个类模板,它用于以容器的insert()函数替代赋值运算符。insert_iterator接受两个参数:一个是容器,另一个是iterator,指向容器内的插入操作起点。通过使用insert_iterator,可以将元素插入到容器的指定位置。 back_inserter()是insert_iterator的一个特化版本,它以容器的push_back()函数替代赋值运算符。对于vector来说,back_inserter是比较适合的insert_iterator。当使用back_inserter时,传入的参数应该是容器本身。 另外,还有一个front_insert_iterator,它用于头端插入操作,对应于STL函数front_inserter()。使用front_insert_iterator时,要求容器自身支持push_front操作。 总之,insert_iterator提供了一种方便的方式来将元素插入到容器中,可以根据需要选择不同的插入方式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [C++ - 插入迭代器Iterator Inserter)](https://blog.csdn.net/weixin_45919985/article/details/127474737)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [C++insert iterator/iostream iterator的使用方法(详细)](https://blog.csdn.net/yuchenshu89757/article/details/52032663)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

双子座断点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值