Pensé en agregar mi propio montón de consejos.
Lo primero que me gustaría señalar es que es muy probable que iterator
y const_iterator
tengan mucha implementación en común. Sin embargo, a pesar de que su código es similar, no es exactamente idéntico. Esto pide plantillas.
Lo segundo que me gustaría señalar es que un const_iterator
debería ser construible desde un iterator
(implícitamente), pero no al revés.
La tercera cosa que me gustaría señalar es que si desea tener una interfaz de tipo map
, debe proporcionar un reverse_iterator
y const_reverse_iterator
también.
Desde un punto de vista de estilo, tiendo a no poner la implementación del iterator
directamente en la clase. Encuentro que no se puede leer cuando la implementación de la clase está llena de tanto código que le cuesta ver los tipos y métodos disponibles. Por esta razón, recomendaría poner la implementación fuera de la clase.
Finalmente, definitivamente recomiendo Boost.Iterator. No puede usarlo, pero lea el material, ¡le dará información sobre cómo escribir el código una vez y lo usará para los 4 tipos!
ilustración rápida:
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;
};
no sé ustedes, pero me siento bien cuando lo haga sólo una cuarta parte de la obra y aprovecha un compilador/biblioteca para rellenar el resto para mí :)
Para su información, la mayoría de las implementaciones de STL basan su std :: map en un árbol rojo-negro, por lo que a menos que sea para fines educativos, podría considerar usar std :: map en lugar de hacer el suyo propio. –