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, " ");
输出为:
请注意两种插入方式的区别: