Estoy buscando utilizar un intrusive unordered_map. Por alguna razón, solo hay un conjunto no ordenado en la biblioteca. También hay una tabla hash intrusa pero no estoy seguro de que tenga la misma funcionalidad, tampoco tiene la misma interfaz.
¿Me equivoco y eché de menos el enlace desordenados?
Si no, ¿hay algún tutorial que me ayude a implementar uno?Boost.Intrusive y unordered_map
Respuesta
Es una pregunta interesante. Boost.Intrusive no parece proporcionar ninguna interfaz de mapa, ordenada o desordenada. Tiene muchos tipos de implementación que funcionarán bien como los mapas ordenados (árboles rojo-negro, árboles AVL, árboles splay) y desordenado (hashtables). Pero no hay mapas y no podría decirte por qué.
tiene dos opciones como lo veo:
- sólo tiene que utilizar
hashtable
: los contenedores no ordenadas se implementan como tablas hash (y la única razón por la que no están llamadoshash_map
es evitar conflictos de nombres con pre -existentes bibliotecas que ya usan ese nombre). Eso funcionará si quieres hacer tu trabajo. - Si realmente desea implementar uno propio, desea echar un vistazo a la descripción de la interfaz para unordered_set de Boost.Intrusive. No he estudiado la implementación, pero es casi seguro que se trata de uno o más de los tipos de árbol.
std::set
ystd::map
ambos se implementan como envoltorios alrededor de un árbol rojo-negro (en todas las implementaciones de bibliotecas estándar que he visto: GCC, MSVC y Apache's stdcxx). También vea cómo libstdC++ ajusta su implementación de árbol en<map>
y en<set>
. Es un montón de repetitivo, mucho tedioso, pero ambos tipos difieren casi todo el trabajo para el árbol. Algo similar está sucediendo con Boost.Intrusiveunordered_set
. Tendrá que observar las diferencias entre el mapa y establecer las interfaces, y usar eso como base para modificarunordered_set
enunordered_map
.
He hecho esto último. Es un poco tedioso, y recomiendo escribir pruebas unitarias para ello (o robar los que vienen con libstdC++ o Boost.Intrusive). Pero es factible. También recomiendo encarecidamente la lectura de los documentos de los requisitos para conjuntos y mapas, ya sea en la SGI (set, map) o para libstdc++
Actualización: me di cuenta de por qué no están haciendo mapas: los contenedores intrusivos requieren que incrusta el información de nodo para la estructura de datos en el tipo de valor que está almacenando en ella. Para los mapas, debe hacer esto para los valores y las claves. No es que esto no sea posible, pero la implementación estándar para un map
usa el mismo tipo interno que el set
s. Pero esos tipos internos solo tienen una variablevalue_type
: para almacenar claves y valores, copian la clave y el valor en esa variable y la almacenan en los nodos. Para hacer eso con un tipo intrusivo (es decir, sin copiar), tendría que modificar ese tipo de implementación para que sea incompatible con los conjuntos: tiene que almacenar las referencias a las claves y los valores por separado. Entonces, para hacerlo también debe modificar la implementación que usa (probablemente hashtable
). Una vez más, no es imposible, pero los diseñadores de la biblioteca probablemente intentan evitar la duplicación de código grave, por lo que, en ausencia de una forma sencilla de implementarlo, lo más probable es que hayan decidido dejar los mapas.
¿Tiene sentido?
Ha pasado mucho tiempo desde que se hizo esta pregunta, pero creo que las personas que vengan aquí deberían estar interesadas en cómo usar un unordered_set
como mapa. La solución es usar advanced insertions methods: uno solo tiene que almacenar una clave y su valor en el mismo value_type
, e insertarlo usando insert_check
y insert_commit
.
Técnicamente, ni siquiera necesita una inserción avanzada, solo necesita una búsqueda avanzada (para encontrar (clave)). –
- 1. Diferencia entre hash_map y unordered_map?
- 2. std :: mapa y std :: unordered_map
- 3. unordered_map thread safety
- 4. Encontrar valor en unordered_map
- 5. iteradores bidireccionales en unordered_map?
- 6. std :: unordered_map initialization
- 7. Usando unordered_map de C++ 0x
- 8. boost :: serialization of boost :: unordered_map
- 9. La diferencia entre python dict y tr1 :: unordered_map en C++
- 10. En el estándar C++ 0x habrá unordered_map, ¿cómo se compara esto con boosts unordered_map?
- 11. Funcionalidad de inserción/función hash unordered_map miserable
- 12. Precategoría de depósitos en C++ unordered_map
- 13. google :: dense_hash_map vs std :: tr1 :: unordered_map?
- 14. Bonito aumento de impresión :: unordered_map en gdb
- 15. Pregunta básica al asignar valor a unordered_map
- 16. estructura como la clave de unordered_map
- 17. std :: unordered_map uso de memoria muy alto
- 18. Usando una tecla const para unordered_map
- 19. diccionario C# a C++ a unordered_map resultados
- 20. Eficiencia de iteradores en unordered_map (C++)
- 21. C++ unordered_map compilar problema con g ++
- 22. GCC 4.4/4.5 unique_ptr no funciona para unordered_set/unordered_map
- 23. ¿Por qué el mapa sería mucho más rápido que unordered_map?
- 24. Las inserciones de valor R no funcionan para unordered_map
- 25. Definición de la función hash personalizada y función de igualdad para unordered_map
- 26. Diferencia en el rendimiento entre el mapa y unordered_map en C++
- 27. Usando std :: tuple como clave para std :: unordered_map
- 28. elementos de almacenamiento en un unordered_set vs almacenándolos en un unordered_map
- 29. C++ unordered_map fallar cuando se utiliza con un vector como clave
- 30. Cómo hacer unordered_map impulso para soportar el peso mosca <string>
¿No vale la pena el problema? Porque estoy considerando el tiempo vs. la calidad aquí. –
Es una buena cantidad de trabajo. Las interfaces para los contenedores estándar tienen muchas sutilezas. Supongo que los contenedores intrusivos también. Si el tiempo es esencial, vaya a la opción 1. Si tiene tiempo y quiere aprender mucho, vaya a la opción 2. – quark
Usted dijo que lo hizo usted mismo. ¿Te importa compartirlo? –