STL 迭代器适配器(iterator adapter)

iterator adapter

graph LR iterator --- reverse_iterator iterator --- Insert_iterator iterator --- iostream_iterator Insert_iterator --- back_insert_iterator Insert_iterator --- front_insert_iterator Insert_iterator --- insert_iterator

插入迭代器:将一般迭代器的赋值操作转变为插入操作。

insert iterator

当用户对inserter iterator作赋值操作时,就在inserter iterator类中定义的operator()中调用底层容器的插入操作(push_back,push_front,insert,etc.).

以back_inserter插入迭代适配器为例:(front_inserter和inserter与该类相类似)

template <class _Container>
inline back_insert_iterator<_Container> back_inserter(_Container& __x) {
  return back_insert_iterator<_Container>(__x);
}

当用户调用back_inserter函数时,函数实际返回后向插入迭代器类(back_insert_iterator)对象,并将容器参数传递给后向插入迭代器类的构造函数。 后向插入迭代器类代码(back_insert_iterator):

template <class _Container>
class back_insert_iterator {
protected:
  _Container* container;
public:
  typedef _Container          container_type;
  typedef output_iterator_tag iterator_category;
  typedef void                value_type;
  typedef void                difference_type;
  typedef void                pointer;
  typedef void                reference;

  explicit back_insert_iterator(_Container& __x) : container(&__x) {}
  back_insert_iterator<_Container>&
  operator=(const typename _Container::value_type& __value) { 
    container->push_back(__value);
    return *this;
  }
  back_insert_iterator<_Container>& operator*() { return *this; }
  back_insert_iterator<_Container>& operator++() { return *this; }
  back_insert_iterator<_Container>& operator++(int) { return *this; }
};

类中有容器类指针_Container* container,指向待插入的容器。在类中定义的赋值操作符=中,调用了底层容器的push_back函数,将operator=参数__value插入到容器尾部。

类中还重载了迭代器操作符:dereference [*],prefix_increment[],post_increment[(int)]。在其函数体中只是简单地返回当前迭代器本身(*this),并未进行相应的前进等操作,说明对此类back_insert_iterator对象进行上述操作是不会产生什么效果。

结合例子分析:

#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>

using namespace std;

int main(){
	int ia[]={1,5,3,6,4,8,9};
	vector<int> ivec(ia,ia+7);
	ostream_iterator<int> outite(cout," ");

	copy(ia,ia+3,back_inserter(ivec));        //a
	copy(ivec.begin(),ivec.end(),outite);
        //1 5 3 6 4 8 9 1 5 3
	cout<<endl;

	return 0;
}

 程序中a行调用back_inserter函数,生成对ivec向量的后向迭代器对象(back_insert_iterator object),并将该对象传入到copy算法。在copy算法中将利用该对象作为函数,对容器中的对象进行处理。  在程序中,后向迭代器对象只是被当作一个函数(functor)使用,对容器调用该对象提供的功能,而不是像传统的迭代器来访问数组中的元素,因此,对其进行dereference [*],prefix_increment[],post_increment[(int)]操作都不会产生什么效果。

程序的运行结果为: 1 5 3 6 4 8 9 1 5 3

猜你喜欢

转载自www.cnblogs.com/SupremeGIS-Developer/p/11964352.html