template <class T, class A = allocator<T> > class vector {
public:
        // ...
        // iterators:

        iterator begin();                               // points to first element
        const_iterator begin() const;
        iterator end();                                 // points to one-past-last element
        const_iterator end() const;

        reverse_iterator rbegin();                      // points to first element of reverse sequence
        const_reverse_iterator rbegin() const;
        reverse_iterator rend();                        // points to one-past-last element of reverse sequence
        const_reverse_iterator rend() const;

        // ...
};


/*
 *  Usage of reverse iterator
 *
 */

template<class C> typename C::iterator find_last(C& c, typename C::value_type v)
{
        typename C::reverse_iterator ri = find(c.rbegin(),c.rend(),v);
        if (ri == c.rend()) return c.end();     // use c.end() to indicate "not found"
        typename C::iterator i = ri.base(); 
        return --i;
}



template<class C> typename C::iterator find_last(C& c, typename C::value_type v)
{
        typename C::iterator p = c.end();       // search backwards from end
        while (p!=c.begin())
                if (*--p==v) return p;
        return c.end();                         // use c.end() to indicate "not found"
}



template<class C> typename C::iterator find_last(C& c, typename C::value_type v)
{
        typename C::reverse_iterator p = c.rbegin();    // view sequence in reverse order
        while (p!=c.rend()) {
                if (*p==v) {
                        typename C::iterator i = p.base(); 
                        return --i;
                }
                ++p;                    // note: increment, not decrement (--)
        }
        return c.end(); // use c.end() to indicate "not found"
}