Compare this with ISO/IEC 14882:1998(E) section 24.1.5 Random access iterators
#include <iterator>
//******************************************************************************
//******************************************************************************
//******************************************************************************
// svector_iter
template <typename T>
class svector_iter : public std::iterator<std::random_access_iterator_tag, T>
{
public:
// For our use
typedef std::random_access_iterator_tag iterator_category;
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef T& reference;
// Forward iterator requirements
svector_iter();
// *** default copy constructor ***
// *** default destructor ***
bool operator==(const svector_iter &rhs) const;
bool operator!=(const svector_iter &rhs) const;
// *** default assignment operator ***
reference operator*(void) const;
pointer operator->(void) const;
svector_iter& operator++(void);
svector_iter operator++(int);
// Bi-directional iterator requirements
svector_iter& operator--(void);
svector_iter operator--(int);
// Random-access iterator requirements
svector_iter& operator+=(int rhs);
svector_iter operator+(int rhs) const;
svector_iter& operator-=(int rhs);
svector_iter operator-(int rhs) const;
difference_type operator-(const svector_iter& rhs) const;
reference operator[](difference_type index) const;
bool operator<(const svector_iter& rhs) const;
bool operator>(const svector_iter& rhs) const;
bool operator<=(const svector_iter& rhs) const;
bool operator>=(const svector_iter& rhs) const;
// Used internally
svector_iter(pointer); // conversion constructor
private:
pointer elem_ptr_; // A pointer to some element
};
//******************************************************************************
//******************************************************************************
//******************************************************************************
// const_svector_iter
template <typename T>
class const_svector_iter : public std::iterator<std::random_access_iterator_tag, T>
{
public:
// For our use
typedef std::random_access_iterator_tag iterator_category;
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef const T* pointer;
typedef const T& reference;
// Forward iterator requirements
const_svector_iter(); // default constructor
// *** default copy constructor ***
// *** default destructor ***
bool operator==(const const_svector_iter &rhs) const;
bool operator!=(const const_svector_iter &rhs) const;
// *** default assignment operator ***
reference operator*(void) const;
pointer operator->(void) const;
const_svector_iter& operator++(void);
const_svector_iter operator++(int);
// Bi-directional iterator requirements
const_svector_iter& operator--(void);
const_svector_iter operator--(int);
// Random-access iterator requirements
const_svector_iter& operator+=(int);
const_svector_iter operator+(int) const;
const_svector_iter& operator-=(int);
const_svector_iter operator-(int) const;
difference_type operator-(const const_svector_iter& rhs) const;
reference operator[](difference_type index) const;
bool operator<(const const_svector_iter& rhs) const;
bool operator>(const const_svector_iter& rhs) const;
bool operator<=(const const_svector_iter& rhs) const;
bool operator>=(const const_svector_iter& rhs) const;
// Used internally
const_svector_iter(pointer); // conversion constructor
private:
pointer elem_ptr_; // A pointer to some element
};