Вот хорошая статья о написании итераторов:
http://www.aristeia.com/Papers/CUJ_June_2001.pdf
Как отмечали большинство людей, вам нужна const-версия begin () и end (), которая возвращает 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, поскольку оно по своей природе опасно).