La clase std :: map C++ STL implementa la búsqueda O (log (n)) usando un árbol binario. Pero con los árboles, no es inmediatamente obvio cómo funcionaría un iterador. ¿Qué significa realmente el operador ++ en una estructura de árbol? Mientras que el concepto de "próximo elemento" tiene una implementación obvia en una matriz, para mí no es tan obvio en un árbol. ¿Cómo se implementaría un iterador de árbol?¿Cómo funciona el iterador std :: map?
Respuesta
Para un recorrido en el interior (probablemente también funciona para otros), si tiene un puntero principal en los nodos, puede hacer un recorrido no recursivo. Debería ser posible almacenar dos punteros en su iterador: necesita una indicación de dónde se encuentra, y probablemente (no estoy investigando ahora) necesita algo así como un puntero "anterior" para que pueda averiguar su dirección de movimiento actual (es decir, ¿necesito ir al subárbol izquierdo, o acabo de regresar de él).
"anterior" se probablemente ser algo así como "padre", si hemos acaba de entrar en el nodo; "left" si volvemos del subárbol izquierdo, "right" si regresamos del subárbol derecho, y "self" si el último nodo que devolvimos es el nuestro.
Una implementación puede saber que los punteros de nodo están alineados con palabras y abusan de los bits inferiores del puntero de nodo para almacenar el estado, en lugar de usar un segundo puntero. – MSalters
Creo que esto es lo que necesitaba. Básicamente, estoy tratando de crear un iterador para una clase de árbol genérica y esto parece funcionar para árboles no ordenados n-arios. – Avi
Considere el conjunto de todos los elementos en el mapa que no son menores que el elemento actual que tampoco son el elemento actual. El "siguiente elemento" es el elemento de ese conjunto de elementos que es menor que todos los demás elementos en ese conjunto.
Para utilizar un mapa, debe tener una clave. Y esa clave debe implementar una operación "menor que". Esto determina la forma en que se forma el mapa, de modo que las operaciones de buscar, agregar, eliminar, incrementar y disminuir sean eficientes.
En general, el mapa utiliza internamente un árbol de algún tipo.
- 1. std :: map insert o std :: map find?
- 2. Cómo insertar en std :: map?
- 3. std :: set iterador automáticamente const
- 4. iterador avanzado para el std :: vector std :: advance VS operator +?
- 5. Cómo convertir un std :: list ordenado de std :: pair a un std :: map
- 6. ¿El iterador personalizado no funciona con BOOST_FOREACH?
- 7. Mapping std :: map to Python
- 8. usando BOOST_FOREACH con std :: map
- 9. std :: map ordena por datos?
- 10. Porting std :: map to C?
- 11. C++: Heredar de std :: map
- 12. std :: invalidación de iterador de vector
- 13. cómo imprimir el valor de std :: map en gdb
- 14. Problema con std :: Mapa :: iterador después de llamar borrado()
- 15. Usando char * como clave en std :: map
- 16. std :: string :: iterador para compensar y volver
- 17. ¿Cómo funciona el iterador en el conjunto de obras
- 18. std :: map and -fno-implicit-templates
- 19. Iterador al último elemento en std :: list
- 20. Usando std :: string como clave para std :: map
- 21. Reemplazar el objeto std :: list dado un iterador
- 22. load std :: map from text file
- 23. const std :: map <boost :: tuples :: tuple, std :: string>?
- 24. std :: map find_if condición condición confusión
- 25. std :: map :: emplace() falta - ¿bibliotecas desactualizadas?
- 26. ¿Cómo funciona C++ std :: vector?
- 27. ¿Cómo fuerzo mi std :: map para desasignar la memoria utilizada?
- 28. Cómo usar el bucle for() basado en rangos con std :: map?
- 29. ¿Diferencia de rendimiento entre el iterador ++ y el iterador ++?
- 30. std :: map of member function punteros?
Puede echar un vistazo a la fuente como punto de partida: http://www.sgi.com/tech/stl/stl_map.h – amit
Observe un árbol de búsqueda binaria autoequilibrante típico (http: // en.wikipedia.org/wiki/Red%E2%80%93black_tree). Es fácil ver un algoritmo que pasa de un nodo determinado al siguiente más grande mirando a los niños correctos o yendo arriba y abajo del árbol. Ocasionalmente tiene que saltar varias veces, pero todavía se amortiza a tiempo constante (ya que la altura del árbol es el logaritmo de la cantidad de elementos). –
Este artículo de la wikipedia puede responder algunas de sus preguntas: [Tree traversal] (http://en.wikipedia.org/wiki/Tree_traversal). Básicamente, el elemento "siguiente" puede ser diferente según el tipo de recorrido que utilice. En el caso de 'std :: map', el árbol se recorre en orden (del elemento más pequeño al más grande). –