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

来源:互联网 发布:新概念4是什么水平知乎 编辑:程序博客网 时间:2024/06/04 19:06

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 0for (list<int>::size_type i = 1; i != 5; i++){ilst.push_back(i);}// 使用front_inserter copycopy(ilst.begin(), ilst.end(), front_inserter(ilst2));// 使用inserter与begin copycopy(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
原创粉丝点击