Как написать свой reverse_iterator, чтобы работал с std функциями?

пишу итераторы для стэка-массива (да, просмотр стэка). Должны быть итератор из конца в начало (в случае стэка у меня это называется iterator) и из начала в конец (reverse_iterator). Хочется, чтобы работали с std функциями (например, sort). Но обычный итератор (то бишь из начала в конец) сделать не получается. Заранее спасибо.

class reverse_iterator : public std::iterator < std::random_access_iterator_tag,

        T,
        ptrdiff_t,
        T*,
        T&>
    {

    private:

        T* ptr;

    public:
        
        reverse_iterator(T* _ptr = nullptr) {
            ptr = _ptr; 
        }

        reverse_iterator(const reverse_iterator& it) = default;

        ~reverse_iterator() {}

        reverse_iterator& operator=(const reverse_iterator& other) = default;
        
        reverse_iterator& operator=(T* _ptr) {
            
            ptr = _ptr; 
            
            return *this; 
        }

        operator bool() const {

            return ptr;
        }

        bool operator== (const reverse_iterator& other) const {
            
            return ptr == other.ptr; 
        }

        bool operator!= (const reverse_iterator& other) const {
            
            return ptr != other.ptr; 
        }

        reverse_iterator& operator+= (const ptrdiff_t& movement) {
            
            ptr += movement; 
            
            return *this; 
        }

        reverse_iterator& operator-= (const ptrdiff_t& movement) {
            
            ptr -= movement; 
            
            return *this; 
        }

        reverse_iterator& operator++ () {
            
            ++ptr; 
            
            return *this; 
        }
        
        reverse_iterator& operator-- () {
            
            --ptr; 
            
            return *this; 
        }
        
        reverse_iterator operator++(int) {
            
            auto temp(*this); 
            
            ++ptr; 
            
            return temp; 
        }

        reverse_iterator operator--(int) {
            
            auto temp(*this); 
            
            --ptr; 
            
            return temp; 
        }
        
        reverse_iterator operator+(const ptrdiff_t& movement) {
            
            auto oldPtr = ptr; 
            
            ptr += movement; 
            
            auto temp(*this); 
            
            ptr = oldPtr; 
            
            return temp; 
        }

        reverse_iterator operator-(const ptrdiff_t& movement) {
            
            auto oldPtr = ptr; 
            
            ptr -= movement; 
            
            auto temp(*this); 
            
            ptr = oldPtr; 
            
            return temp; 
        }

        ptrdiff_t operator-(const reverse_iterator& other) {
            
            return std::distance(other.ptr, ptr); 
        }

        T& operator*() { 
            
            return *ptr; 
        }

        const T& operator*()const { 
            
            return *ptr; 
        }
        
        T* operator->() { 
            
            return ptr; 
        }

        T* getPtr() const { 
            
            return ptr; 
        }
        
        const T* getConstPtr() const { 
            
            return ptr; 
        }
    };

    class iterator : public std::iterator < std::random_access_iterator_tag,

        T,
        ptrdiff_t,
        T*,
        T&>
    {

    private:

        T* ptr;

    public:

        iterator(T* _ptr = nullptr) {
            ptr = _ptr;
        }

        iterator(const iterator& it) = default;

        ~iterator() {}

        iterator& operator=(const iterator& other) = default;

        iterator& operator=(T* _ptr) {

            ptr = _ptr;

            return *this;
        }

        operator bool() const {

            return ptr;
        }

        bool operator==(const iterator& other) const {

            return ptr == other.ptr;
        }

        bool operator!= (const iterator& other) const {

            return ptr != other.ptr;
        }

        ptrdiff_t operator-(const reverse_iterator& other) {

            return std::distance(ptr, other.ptr);
        }

        ptrdiff_t operator-(const iterator& other) {

            return std::distance(other.ptr, ptr);
        }

        iterator& operator+= (const ptrdiff_t& movement) {

            ptr -= movement;

            return *this;
        }

        iterator& operator-= (const ptrdiff_t& movement) {

            ptr += movement;

            return *this;
        }

        iterator& operator++ () {

            --ptr;

            return *this;
        }

        iterator& operator-- () {

            ++ptr;

            return *this;
        }

        iterator operator++(int) {

            auto temp(*this);

            --ptr;

            return temp;
        }

        iterator operator--(int) {

            auto temp(*this);

            ++ptr;

            return temp;
        }

        iterator operator+(const ptrdiff_t& movement) {

            auto oldPtr = ptr;

            ptr -= movement;

            auto temp(*this);

            ptr = oldPtr;

            return temp;
        }

        iterator operator-(const ptrdiff_t& movement) {

            auto oldPtr = ptr;

            ptr += movement;

            auto temp(*this);

            ptr = oldPtr;

            return temp;
        }

        T& operator*() {

            return *ptr;
        }

        const T& operator*()const {

            return *ptr;
        }

        T* operator->() {

            return ptr;
        }

        T* getPtr() const {

            return ptr;
        }

        const T* getConstPtr() const {

            return ptr;
        }
    };

    reverse_iterator rbegin() {
        return stk_arr;
    }

    reverse_iterator rend() {
        return stk_arr + sz;
    }

    iterator begin() {
        return stk_arr + sz - 1;
    }

    iterator end() {
        return stk_arr - 1;
    }


Ответы (0 шт):