#include <iterator>
template<class Cont>
class overwrite_iterator
: public std::iterator<std::output_iterator_tag, void, void> {
public:
typedef Cont container_type;
typedef Cont::value_type value_type;
explicit overwrite_iterator(Cont& x)
: cont(x), iter(x.begin())
{}
overwrite_iterator(Cont& x, Cont::iterator it)
: cont(x), iter(it)
{}
overwrite_iterator& operator=(const Cont::value_type& val)
{
iter == cont.end() ? cont.push_back(val)
: (*iter = val, ++iter);
return *this;
}
overwrite_iterator& operator*()
{
return *this;
}
overwrite_iterator& operator++()
{
return *this;
}
overwrite_iterator operator++(int)
{
return *this;
}
operator Cont::iterator()
{
return iter;
}
protected:
Cont& cont;
Cont::iterator iter;
};
End of Listing