Después de another question about iterators Tengo algunas dudas sobre los contenedores personalizados. En mi contenedor, iterator
es una subclase de const_iterator
, de modo que obtengo la conversión de non-const a const "gratis". Pero, ¿está permitido o hay inconvenientes o escenarios que no funcionan para dicha configuración?¿Puede 'iterator' escribir solo la subclase 'const_iterator'?
Respuesta
Sí, esto está bien. Así es como la implementación de VC10 de los iteradores para vector
están estructurados, por ejemplo. Consulte _Vector_iterator
y _Vector_const_iterator
en <vector>
.
Por cierto, escribir iteradores es difícil. Vale la pena el tiempo para aprender y usar la biblioteca boost :: iterator.
Piense en un caso que será necesario que modificar los miembros del repetidor.
Y? Supongo que debes elaborarlo. – doublep
Las subclases me parecen extrañas aquí, pero efectivamente hay un problema.
Incluso si no desea depender de las piezas Boost, consulte la biblioteca Boost.Iterator, y más especialmente los iterator_facade
y iterator_adaptor
bits.
Existe un completo ejemplo de cómo escribir un iterator
y un const_iterator
para su clase sin duplicar demasiado. Su idea es escribir un iterator_base
clase de plantilla que luego se puede utilizar para la const y no const tipos en la línea de:
template <class Value> class iterator_base;
typedef iterator_base<T> iterator;
typedef iterator_base<const T> const_iterator;
El problema con la subclasificación es que a continuación, debe proporcionar un destructor virtual y que está expuesto a cortar (al construir un const_iterator
desde un iterator
)
Por lo tanto, a diferencia de otros aquí, no me parece "bien".
"Debería proporcionar un destructor virtual", pero mis destructores no hacen nada de todos modos. Incluso si lo hicieran, el tipo 'iterator' probablemente heredará el destructor' const_iterator', sin hacer nada extra. "Estás expuesto a rebanar". ¿Puedes explicarme mejor? No entiendo lo que quieres decir aquí. – doublep
Un ejemplo de segmentación, 'iterator it; const_iterator cit = static_cast
- 1. C++ iterator to const_iterator
- 2. C++: ¿Cómo escribir un const_iterator?
- 3. ¿Las comparaciones entre iterator y const_iterator son ineficaces?
- 4. Obtención de const_iterator del iterador
- 5. Cómo eliminar la constness de const_iterator?
- 6. ¿Existe una diferencia operativa entre std :: set :: iterator y std :: set :: const_iterator?
- 7. Diferente eficiencia de iterador y const_iterator (STL)
- 8. Vector iterator no se puede referenciar?
- 9. No se puede sangrar la subclase UITableViewCell
- 10. Estándar de C++: const_iterator inesperado en multiset
- 11. bloques Iterator y la herencia
- 12. m.find (...) == m.end() - que se usa, iterador o const_iterator
- 13. Directrices para una clase Iterator
- 14. boost iterator facade y la función dereference()
- 15. iterator successor
- 16. JavaScript Iterator Clase
- 17. Subclase o no a la subclase
- 18. ¿Puede un constructor devolver una subclase?
- 19. La subclase NSControl no puede leer el objetivo?
- 20. List Iterator Remove()
- 21. C++ Iterator Pipelining Designs
- 22. ¿Por qué Iterator define la operación remove()?
- 23. cómo detectar si un tipo es un iterador o const_iterator
- 24. ¿Cuál es la diferencia entre const_iterator y el iterador non-const en C++ STL?
- 25. map/set iterator no incrementablemap/set iterator no incrementable
- 26. Crear subclase con diferentes propiedades subclase
- 27. PHP Lazy Load Iterator
- 28. Vector iterator no referenciable
- 29. C++ Template Iterator error
- 30. Iterator en lenguaje C
Lo sé, pero en mi caso es una biblioteca pequeña y no quiero que dependa de nada, incluidas las partes de Boost. – doublep
Ya es bueno que alguna implementación de STL funcione así. ¿Conoces una cláusula en el estándar que describe los iteradores y los requisitos en general? – doublep
24.2 del FCD (n3035.pdf) describe los iteradores y sus requisitos –