前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >插入迭代器

插入迭代器

作者头像
大忽悠爱学习
发布2021-11-15 10:38:35
2600
发布2021-11-15 10:38:35
举报
文章被收录于专栏:c++与qt学习

定义:

  • 插入迭代器是一种迭代器适配器,它接受一个容器,生成一个迭代器,能实现向给定容器添加元素。
  • 其实适配器的本质就是实现不变,改变接口。
  • 例如容器适配器可以使一个容器vector表现得像一个stack一样,这里的迭代器适配器也是如此。

插入器有三种类型,差异在于元素插入的位置:

  • back_inserter 创建一个使用push_back的迭代器。
  • front_inserter 创建一个使用push_front的迭代器。
  • inserter 创建一个使用insert的迭代器。

假设iter是一个插入迭代器,则

  • iter = val;
  • 在iter指定的当前位置插入值val。
  • 假定c是it绑定的容器,依赖于插入迭代器的不同种类,此赋值会分别调用c.push_back(val)、c.push_front(val)或c.inserter(iter,pos),其中pos为传递给inserter的迭代器位置
  • *iter,++iter,iter++
  • 这些操作虽然存在,但不会对iter做任何事情,每个操作都返回iter

tips: 只有在容器支持push_front的情况下,才能使用front_inserter。同样,只有容器支持push_back的情况下,才能使用back_inserter。

代码演示:

代码语言:javascript
复制
#include<iostream>
#include<list>
#include<algorithm>
using namespace std;
void test()
{
	list<int> lst = { 1,2,3,4 };
	list<int> lst1, lst2;
	auto iter_back = back_inserter(lst1);
	auto iter_front = front_inserter(lst2);
	//写法1:
	*iter_back = 520;//等价于lst1.push_back(520)
	cout << lst1.front() << endl;
	lst1.pop_front();
	//写法2:
	iter_back = 521;//等价于lst1.push_back(521)
	cout << lst1.front() << endl;
	//注意:写法1和写法2等价的原因是*it,++it和it++不会对it做任何事情

    //下面统一用写法2:
	//注意:我们使用front_inserter总是插入到容器第一个元素之前
	iter_front = 1;
	iter_front = 2;
	iter_front = 3;
	for_each(lst2.begin(), lst2.end(), [](int val) {cout << val << " "; });
	cout << endl;
}
int main()
{
	test();
	system("pause");
	return 0;
}
在这里插入图片描述
在这里插入图片描述

结合copy算法演示

  • copy算法并不检查目的序列,所以使用前务必保证目的序列大小不小于输入序列
  • 重点来了,使用插入器则不用考虑目的序列与输入序列的大小关系
代码语言:javascript
复制
#include<iostream>
#include<list>
#include<algorithm>
using namespace std;
void test()
{
	list<int> lst = { 1,2,3,4 };
	list<int> lst1, lst2;
	auto iter_back = back_inserter(lst1);
	auto iter_front = front_inserter(lst2);
	lst1.push_back(520);
	lst2.push_back(520);
	copy(lst.begin(), lst.end(), iter_back);
	copy(lst.begin(), lst.end(), iter_front);
	cout << "调用iter_back后lst1=   ";
	for_each(lst1.begin(), lst1.end(), [](int val) {cout << val << " "; });
	cout << endl;
	cout << "调用iter_front后lst2=   ";
	for_each(lst2.begin(), lst2.end(), [](int val) {cout << val << " "; });
	cout << endl;
}
int main()
{
	test();
	system("pause");
	return 0;
}
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/04/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档