C++ insert_iterator实现的学习(Boolan学习笔记第10周)

C++的inserter可以把一些数值插入到现有容器的已存在的数值里面,举例如下:

    int myints[]={10,20,30,40,50,60,70};
    vector<int> myvec(7);
    copy(myints, myints+7, myvec.begin());

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

    list<int>::iterator it=foo.begin();
    advance(it,3);

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

其实现效果为

这里写图片描述

看起来好像很简单,但是如果深入一下好像并不简单。首先我们来看copy()这个函数。stl里面copy的代码实现可以简化为

template<class InputIterator, class OutputIterator>
OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result)
{
    while(first!=last){
      *result = *first;
      ++result;
      ++first;
    }

    return result;
}

我们可以看出,copy就是将result的内容逐一拷贝到目标地址(从first开始)而已,这是覆盖,根本就不是插入嘛。那么insert功能是怎么实现的呢?

继续深入, inserter其实就是insert_iterator的一个wrapper函数而已,其实现代码如下:

template<class Container, class Iterator>
inline insert_iterator inserter(Container &x, Iterator i)
{
   typedef typename Container::iterator iter;
   return insert_iterator(x,iter(i));
}

继续深入,看看class insert_iterator长什么样。其实现代码可以简化如下:

template<class Container>
class insert_iterator {
    protected: 
       Container* container;
       typename Container::iterator iter;
    public:
       typedef output_iterator_tag iterator_category;

    insert_iterator(Container& x, typename Container::iterator i): container(&x), iter(i) {}

    insert_iterator & operator=(const typename Container::value_type& value)
    {
       iter=container->insert(iter, value);
       ++iter;
       return *this;
    }   
};

我们可以看出点名堂出来了,关键在insert_iterator重载了operator=, 在重载函数中又调用了container->insert,使得insert iterator永远随着其target贴身移动。

在copy()函数中, 里面的

 *result = *first;

就会调用insert_iterator里面的operator=重载函数,这样,就实现了插入功能。看来操作符重载的功能真的很强大啊。

你可能感兴趣的:(C++,c++)