C++学习笔记29——泛型算法之插入迭代器

1,插入迭代器相关概念

插入迭代器(insert iterator):使用容器操作插入元素而不是覆写元素的迭代器。给插入迭代器赋值,等效于将具有所赋值的新元素插入到序列中。
头文件:
#include <iterator>
using std::inserter;
using std::back_inserter;
using std::front_inserter;

注意:容器中前端(front)指的是靠近begin那端,后端(back)指的是靠近end那端。

插入器(inserter):一种迭代器适配器,带有一个容器参数,并生成一个特定类型的插入迭代器。
C++提供了3种插入器,他们之间的区别在于插入元素的位置不同:
(1)back_inserter,创建使用push_back实现插入的迭代器,
  返回 back_insert_iterator<Container>,如: std::back_insert_iterator<std::vector< int > >
(2)front_inserter,创建使用push_front实现插入的迭代器,所以绑定的容器必须支持push_front操作,vector容器就不行。
     返回front_insert_iterator<Container>,如: std::front_insert_iterator<std::list< int > >
(3)inserter,创建使用inserter实现插入的迭代器,
     返回 insert_iterator<Container>,如: std::insert_iterator<std::vector< int > >

2,back_inserter

template< class Container >
std::back_insert_iterator<Container> back_inserter( Container& c );
效果:输入指定的容器,产生与该容器绑定的back_insert_iterator插入迭代器。
给back_insert_iterator赋值,相当于在原容器的尾部追加数据。
所有顺序容器都适用,因为所有顺序容器都适用push_back()操作.
        /*******************************************************************/
	//        back_insert_iterator与back_inserter
	/*******************************************************************/
	// 输入
	vector<int> vec;
	for (int i = 0; i < 3; ++i)
	{
		vec.push_back(i);
	}		

	// 打印原始输入
	vector <int>::iterator vIter;
	cout << "The initial vector vec is: ( ";
	for (vIter = vec.begin(); vIter != vec.end(); vIter++)
	{ 
		cout << *vIter << " ";
	}		
	cout << ")." << endl;

	// 直接通过插入迭代器赋值
	// 在原容器的尾部追加数据
	back_insert_iterator<vector<int> > backiter(vec);
	*backiter = 30;
	backiter++;      //需要手动自增
	*backiter = 40;

	// 用back_inserter生成插入迭代器,赋值
	back_inserter(vec) = 500;  //自动自增
	back_inserter(vec) = 600;

	// 打印输出
	cout << "After the insertions, the vector vec is: ( ";
	for (vIter = vec.begin(); vIter != vec.end(); vIter++)
	{ 
		cout << *vIter << " ";
	}		
	cout << ")." << endl;

输出为:


3,front_inserter

template< class Container >
std::front_insert_iterator<Container> front_inserter( Container& c );
效果:输入指定的容器,产生与该容器绑定的front_insert_iterator插入迭代器。
给front_insert_iterator赋值,相当于在原容器的前端插入数据,亦即相当于每次调用push_front()。
不适用于vector容器,因为其不支持push_front()操作。

4,inserter

template< class Container >
std::insert_iterator<Container> inserter( Container& c, typename Container::iterator i );
效果:输入指定的容器和插入起始位置的迭代器,产生与该容器绑定的insert_iterator插入迭代器。
给insert_iterator赋值,相当于在原容器的指定位置插入数据,亦即相当于每次调用insert()。
所有顺序容器都适用,因为所有顺序容器都适用insert()操作.

注意:inserter与front_inserter插入位置的区别。用insert和begin迭代器配合也无法实现front_insert的效果。
        /*******************************************************************/
	//        inserter与front_inserter
	/*******************************************************************/
	list<int> ilst; 
	list<int> ilst2 = { 0 };
	list<int> ilst3 = { 0 };
	
	// 给ilst赋值,赋值完成后ilst的元素为:3 2 1 0
	for (list<int>::size_type i = 1; i != 5; i++)
	{
		ilst.push_back(i);
	}

	// 使用front_inserter copy
	copy(ilst.begin(), ilst.end(), front_inserter(ilst2));

	// 使用inserter与begin copy
	copy(ilst.begin(), ilst.end(), inserter(ilst3,ilst3.begin()));

	//调用自写函数print_ilist打印3个容器
	cout << "原始输入:";
	print_ilist(ilst , " ");

	cout << "front_inserter:";
	print_ilist(ilst2, " ");

	cout << "inserter与begin:";
	print_ilist(ilst3, " ");

输出为:


请注意两种插入方式的区别:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值