Skip to content

Reverse & Move Iterators

reverse_iterator

Overview

prototype::reverse_iterator<Iterator> adapts a bidirectional iterator to traverse a range in reverse order.

API

namespace prototype {

template <typename Iterator>
class reverse_iterator {
public:
    explicit reverse_iterator(Iterator base);

    Iterator base() const;

    reference operator*() const;
    pointer operator->() const;

    reverse_iterator& operator++();    // moves backward
    reverse_iterator& operator--();    // moves forward
    reverse_iterator operator+(difference_type n) const;
    reverse_iterator operator-(difference_type n) const;

    bool operator==(const reverse_iterator& other) const;
    bool operator!=(const reverse_iterator& other) const;
    bool operator<(const reverse_iterator& other) const;
};

} // namespace prototype

Example

#include <prototype/iterators/reverse_iterator.hpp>

prototype::vector<int> data = {10, 20, 30, 40, 50};

using rit = prototype::reverse_iterator<int*>;
for (rit it(data.end()); it != rit(data.begin()); ++it) {
    printf("%d ", *it);  // 50 40 30 20 10
}

Design Notes

  • operator* returns *(base() - 1) the base iterator points one past the element
  • RandomAccessIterator operations are O(1) when base iterator supports them
  • Zero overhead when inlined just reverses the increment direction

move_iterator

Overview

prototype::move_iterator<Iterator> wraps an iterator so dereferencing produces T&& instead of T&. This enables efficient bulk transfer using existing copy algorithms.

API

namespace prototype {

template <typename Iterator>
class move_iterator {
public:
    explicit move_iterator(Iterator base);

    Iterator base() const;
    rvalue_reference operator*() const;  // returns std::move(*base())

    move_iterator& operator++();
    move_iterator& operator--();
};

template <typename Iterator>
move_iterator<Iterator> make_move_iterator(Iterator it);

} // namespace prototype

Example

#include <prototype/iterators/move_iterator.hpp>
#include <prototype/algorithms/copy.hpp>

prototype::vector<prototype::string> source = {"hello", "world"};
prototype::vector<prototype::string> dest(2);

// Move all strings from source to dest (source strings left empty)
prototype::copy(
    prototype::make_move_iterator(source.begin()),
    prototype::make_move_iterator(source.end()),
    dest.begin()
);
// dest = {"hello", "world"}, source = {"", ""}

When to Use

  • Moving elements from a temporary container
  • Transferring ownership during reallocation
  • Any copy algorithm where you want move semantics instead of copy

Performance

Operation Complexity Notes
operator* O(1) Cast to rvalue reference
operator++/-- O(1) Delegates to base
Copy with move_iterator O(n) But moves instead of copies

Safety Notes

Source state

After using move_iterator to transfer elements, the source elements are in a valid but unspecified state. Don't read from them without reassigning first.