Чтобы иметь возможность использовать диапазон на основе, ваш класс должен предоставить const_iterator begin() const
и const_iterator end() const
членов. Вы также можете перегрузить глобальную функцию begin
, но, на мой взгляд, лучше иметь функцию-член. iterator begin()
и const_iterator cbegin() const
также рекомендуются, но не обязательны. Если вы просто хотите перебрать один внутренний контейнер, это ДЕЙСТВИТЕЛЬНО просто:
template< typename Type>
class SomeSortedContainer{
std::vector<Type> m_data; //we wish to iterate over this
//container implementation code
public:
typedef typename std::vector<Type>::iterator iterator;
typedef typename std::vector<Type>::const_iterator const_iterator;
iterator begin() {return m_data.begin();}
const_iterator begin() const {return m_data.begin();}
const_iterator cbegin() const {return m_data.cbegin();}
iterator end() {return m_data.end();}
const_iterator end() const {return m_data.end();}
const_iterator cend() const {return m_data.cend();}
};
Если вы хотите перебирать все что угодно, вам, вероятно, придется создавать собственные итераторы как классы внутри вашего контейнера.
class const_iterator : public std::iterator<random_access_iterator_tag, Type>{
typename std::vector<Type>::iterator m_data;
const_iterator(typename std::vector<Type>::iterator data) :m_data(data) {}
public:
const_iterator() :m_data() {}
const_iterator(const const_iterator& rhs) :m_data(rhs.m_data) {}
//const iterator implementation code
};
Подробнее о написании класса итератора см. мой ответ здесь .