std::inserter uses the plain iterator of the container, so it can't be used to insert elements in reverse order.
std::insert_iterator can't be passed to std::make_reverse_iterator, because it has void member types.
So I suggest adding reverse inserter, Like this:
namespace std {
template <class Container> class reverse_insert_iterator {
private:
typedef typename Container::iterator __i;
protected:
Container *container;
__i iter;
public:
typedef Container container_type;
typedef void value_type, difference_type, pointer, reference;
typedef output_iterator_tag iterator_category;
explicit reverse_insert_iterator(Container &c, __i i) noexcept :
container(&c), iter(make_reverse_iterator(i)) {}
reverse_insert_iterator &operator = (const typename Container::value_type &value) {
iter = container->insert(iter, value);
// Note that iter isn't increased here and thus simulates reverse insertion.
return *this;
} reverse_insert_iterator &operator = (typename Container::value_type &&value) {
iter = container->insert(iter, value);
// Ditto.
return *this;
}
reverse_insert_iterator &operator * () noexcept {
return *this;
} reverse_insert_iterator &operator ++ () noexcept {
return *this;
} reverse_insert_iterator &operator ++ (int) noexcept {
return *this;
}
};
template <class Container>
reverse_insert_iterator<Container> reverse_inserter(Container &c, typename Container::iterator i) noexcept {
return reverse_insert_iterator<Container>(c, i);
}
}