I'm taking a course where we're being introduced to a few software patterns, one of them being the iterator pattern, and we're being asked to implement it in C++. Our professor gave us some sample code a few weeks ago and I'd like to understand it a little better than I do. First I'll post the code:
template <class T_,std::size_t SIZE_>
class carray {
public:
typedef T_              value_type;
typedef std::size_t     size_type;
typedef T_ &            reference;
typedef T_ const &      const_reference;
typedef T_ *            pointer;
typedef T_ const *      const_pointer;
typedef T_ *            iterator;
typedef T_ const *      const_iterator;
typedef std::ptrdiff_t  difference_type;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
// data store
value_type data[SIZE_];
size_type   size() const { return SIZE_; }
reference operator [] ( size_type idx ) { return data[idx]; }
const_reference operator [] ( size_type idx ) const { return data[idx]; }
reverse_iterator    rbegin() { return reverse_iterator( end() ); }
reverse_iterator    rend() { return reverse_iterator( begin() ); }
const_reverse_iterator  rbegin() const { return const_reverse_iterator( end() ); }
const_reverse_iterator  rend() const { return const_reverse_iterator( begin() ); }
const_reverse_iterator  crbegin() const { return const_reverse_iterator( end() ); }
const_reverse_iterator  crend() const { return const_reverse_iterator( begin() ); }
iterator    begin() { return data; }
iterator    end() { return data + SIZE_; }
const_iterator  begin() const { return data; }
const_iterator  end() const { return data + SIZE_; }
const_iterator  cbegin() const { return data; }
const_iterator  cend() const { return data + SIZE_; }
};
In this template our prof defined a bunch of typedefs, and a few of them had both a non-constant and constant version. First, I wonder what the purpose of each of the public members are, and second, I wonder what the purpose of the constant versions are, in the context of defining a data structure template.
I also notice that some of the member functions are defined as 'const' and I wonder what the purpose of that is.
 
     
     
     
    