模板函数代码如下:
template<typename _Container, typename _Iterator>
inline insert_iterator<_Container>
inserter(_Container& __x, _Iterator __i)
{
return insert_iterator<_Container>(__x, typename _Container::iterator(__i));
}
最终返回的是个insert_iterator迭代器,这个迭代器模板定义如下:
template<typename _Container>
class insert_iterator : public iterator<output_iterator_tag, void, void, void, void>
{
protected:
_Container* container;
typename _Container::iterator iter;
public:
typedef _Container container_type;
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=(typename _Container::value_type&& __value)
{
iter = container->insert(iter, std::move(__value));
++iter;
return *this;
}
insert_iterator&
operator*()
{ return *this; }
insert_iterator&
operator++()
{ return *this; }
insert_iterator&
operator++(int)
{ return *this; }
};
该类型对赋值运算符进行了重载,本质上就是调用传递进去的容器的insert接口,将赋值数值插入在设定为位置,然后插入位置后移一个单元;
在定义了一个容器时,此时容器中逻辑上是没有存放数据的空间的,因此不能对容器某个元素进行直接赋值,需要使用insert进行对应的空间申请,然后数值设置,以及设置他的一系列迭代器等;如果希望通过generate,fill等模板函数对一个容器进行一些参数设置,此时就可以使用这个迭代器去间接调用容器insert;
甚是好用。