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<Container> inserter(Container &x, Iterator i)
{
typedef typename Container::iterator iter;
return insert_iterator<Container>(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<Container> & 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=重载函数,这样,就实现了插入功能。看来操作符重载的功能真的很强大啊。