iterator adapter inserter

1.insert_iterator

这个adapter将iterator的赋值(assign)操作变为安插(insert操作),并将iterator右移一个位置。如此便可让user连续执行[表面上assign而实际上insert]的行为。

template <class _Container>
class insert_iterator {
protected:
  _Container* container ; //底层容器
  typename _Container::iterator iter;
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;

  insert_iterator(_Container& __x, typename _Container::iterator __i)
    : container (&__x), iter (__i) {}
  insert_iterator<_Container>&
  operator=(const typename _Container::value_type& __value) {
    iter = container-> insert(iter, __value);  //关键:转调用insert()
    ++ iter//令insert_iterator永远跟随其target贴身移动
    return *this;
  }
  insert_iterator<_Container>& operator*() { return *this; }
  insert_iterator<_Container>& operator++() { return *this; }
  insert_iterator<_Container>& operator++(int) { return *this; }

};

2.inserter

辅助函式,帮助user使用inserter_iterator

template <class _Container, class _Iterator>
inline
insert_iterator<_Container> inserter(_Container&__x, _Iterator__i)
{
  typedef typename _Container::iterator __iter;
  return insert_iterator<_Container>(__x, __iter(__i));
}

3.copy

template<class InputIterator,

             class OutputIterator>

OutputIterator

          copy(InputIterator first,InputIterator last,OutputIterator result)

{

              while(first != last) {

                      *result = *first;

                      ++result ; ++first;

               }

               return result;

}

4.示例

http://www.cplusplus.com/reference/iterator/inserter/


// inserter example
#include <iostream>     // std::cout
#include <iterator>     // std::front_inserter
#include <list>         // std::list
#include <algorithm>    // std::copy

int main () {
  std::list<int> foo,bar;
  for (int i=1; i<=5; i++)
  { foo.push_back(i); bar.push_back(i*10); }

  std::list<int>::iterator it = foo.begin();
  advance (it,3);
  std::cout << "foo contains:";
  for ( std::list<int>::iterator it = foo.begin(); it!= foo.end(); ++it )
	  std::cout << ' ' << *it;
  std::cout << '\n';
  
  std::cout << "bar contains:";
  for ( std::list<int>::iterator it = bar.begin(); it!= bar.end(); ++it )
	  std::cout << ' ' << *it;
  std::cout << '\n';

  std::copy (bar.begin(),bar.end(),std::inserter(foo,it));


  std::cout << "foo contains:";
  for ( std::list<int>::iterator it = foo.begin(); it!= foo.end(); ++it )
	  std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

执行结果:


            

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值