Я думал, что добавлю свой маленький пакет советов.
Первое, что я хотел бы отметить, - это то, что iterator
и const_iterator
, скорее всего, имеют много общего в своей реализации. Однако, хотя их код похож, он не совсем идентичен. Это напрашивается на шаблоны.
Второе, что я хотел бы отметить, это то, что const_iterator
должен быть конструируемым из iterator
(неявно), но не наоборот.
Третье, что я хотел бы отметить, - это то, что если вы хотите иметь интерфейс, подобный map
, то вам также необходимо предоставить reverse_iterator
и const_reverse_iterator
.
С точки зрения стиля, я не склонен помещать реализацию самого iterator
прямо в класс. Я нахожу это нечитаемым, когда реализация класса захламлена таким большим количеством кода, что вам трудно увидеть доступные типы и методы. По этой причине я бы рекомендовал размещать реализацию вне класса.
Наконец, я определенно рекомендую Boost.Iterator. Вы можете не использовать его, но прочитайте материал, он, в частности, даст вам представление о том, как написать код один раз и использовать его для 4 видов!
Быстрая иллюстрация:
namespace detail {
template <class Value> class base_iterator;
}
template <class Value>
class container
{
public:
typedef detail::base_iterator<Value> iterator;
typedef detail::base_iterator<Value const> const_iterator;
typedef boost::reverse_iterator<iterator> reverse_iterator;
typedef boost::reverse_iterator<const_iterator> const_reverse_iterator;
};
Я не знаю о вас, но мне хорошо, когда я делаю только четверть работы и использую компилятор / библиотеку, чтобы заполнить остальное для меня:)