Вот хорошая статья по написанию итераторов:
http://www.aristeia.com/Papers/CUJ_June_2001.pdf
Поскольку большинство людей отметили вам нужно константные версии начать() и конец(), который возвращает const_iterator.
Большинство людей забыли, что итератор должен иметь возможность неявно преобразовывать в const_iterator. В противном случае трудно получить константный итератор из объекта без стоимости (без множества неприятных бросков).
my_cont data;
for(my_cont::const_iterator loop = data.begin(); loop != data.end(); ++loop)
{
/* STUFF */
}
Замечание выше: Вышеупомянутые вызовы фактически вызовут нерентабельные версии begin() и end(). Но они назначаются на const_iterator. Таким образом, ваши итераторы должны быть конвертируемыми в const_iterator для работы вышеприведенного кода (Примечание: нет никакого неявного преобразования из const_iterator в итератор. Это должно принимать явный const_cast, поскольку он по своей сути опасен).
class my_cont
{
public:
class iterator { /* STUFF */ }
class const_iterator
{
public: const_iterator(iterator const& rhs);
/* STUFF */
}
iterator begin();
iterator end();
const_iterator begin() const;
const_iterator end() const;
/* STUFF*/
};
У вас есть 'const' версия' begin() ', которая возвращает итератор, который работает с контейнером' const'? –