Tengo un conjunto de datos que necesito almacenar en un mapa ordenado (es decir, con inserción, eliminación y ubicación eficiente de elementos por clave), pero también necesito estar capaz de encontrar el elemento nth sin recorrer todo el mapa (a veces puede haber decenas de miles de elementos en él).std :: mapa con acceso eficiente a elemento n
Conozco una forma de hacerlo: use un árbol rojo/negro, pero mantenga también el número total de elementos secundarios en una de las patas de cada nodo. Hace que la inserción y la eliminación sean un poco más lentas (porque debe actualizar los recuentos en cada nodo a lo largo de la ruta como lo hace), pero puede encontrar el nth elemento para cualquier n casi al mismo tiempo que encuentra una clave .
Me pregunto si existe una implementación de C++ existente que pueda usar. Puedo escribirlo yo mismo si no, pero preferiría no hacerlo.
EDIT: Tengo algunas aclaraciones sobre el caso de uso para ello. Lo malentendí ligeramente: después de buscar un elemento por clave, necesitan la capacidad de averiguar de manera eficiente qué índice es el elemento encontrado, para mostrar correctamente las barras de desplazamiento.
Es es una necesidad legítima, y la estructura de datos que describí anteriormente aún funcionará para él, así que todavía estoy buscando una respuesta. Pero como parece que nadie ha llegado con uno todavía, voy a comenzar a codificarlo yo mismo.
Las implementaciones de la biblioteca estándar no son compatibles, pero tiene razón en que un árbol R/B aumentado funcionaría. Sin embargo, no conozco ninguna implementación de esto. :-( – templatetypedef
Parece que eligió el contenedor equivocado. Los mapas se indexan por clave, * no * mediante una "posición desde el principio" arbitraria. –
@Tomalak: Parece que están en el proceso de elegir el contenedor correcto, y no puede encontrar sus requisitos en stdlib u otro lugar. –