介绍
用来将“赋新值操作”转换为“安插新值”操作,通过这种迭代器,算法可以执行安插(insert)操作而非覆盖(overwrite)操作。所有insert迭代器都属于output迭代器。
- Insert迭代器的功能
通常算法会将数值赋值给标的迭代器,如copy()算法
namespace std
{
template<typename InputIterator, typename OutputIterator>
OutputIterator copy(InputIterator from_pos, InputIterator from_end, OutputIterator to_pos)
{
while (from_pos != from_end)
{
*to_pos = *from_pos;
++from_pos;
++to_pos;
}
return to_pos;
}
}
需要注意的是赋值操作会被转换为安插操作,事实上insert迭代器会调用容器的push_back(),push_front()或insert()成员函数。
- 迭代器的种类
事实上它们各自调用所属容器中不同的成员函数,所以insert迭代器初始化时一定要清楚知道自己所属的容器哪一种。每一种insert迭代器都可以由一个对应的便捷函数加以生成和初始化当然,容器本身必须支持insert迭代器所调用的函数,否则insert迭代器就不可用,因此back inserters只能用在vector,deque,list,string上,front inserters只能用在deque和list上。
back inserters
声明
template <class Container> class back_insert_iterator;
/*
可知其template需要一个容器型别
*/
实现如下
template <class Container>
class back_insert_iterator : public iterator<output_iterator_tag,void,void,void,void>
{
protected:
Container* container;
public:
typedef Container container_type;
explicit back_insert_iterator (Container& x) : container(&x) {} //构造函数,需要带入容器型别为参数
back_insert_iterator<Container>& operator= (typename Container::const_reference value) //赋值时调用容器的push_back()操作
{
container->push_back(value);
return *this;
}
back_insert_iterator<Container>& operator* () //什么也不做,只是返回这个对象
{
return *this;
}
back_i