Estoy tratando de implementar la caché LFU (uso menos frecuente) usando STL puro (no quiero usar Boost!).¿Cómo implementar la memoria caché LFU usando STL?
Los requisitos son:
- el acceso a cualquier elemento asociativo utilizando un
Key
como constd::map
. - Posibilidad de liberar el elemento de prioridad más baja (utilizando su atributo
UsesCount
). - Posibilidad de actualizar la prioridad (
UsesCount
) de cualquier elemento.
Los problemas son:
- Si uso
std::vector
como contenedor de artículos (Key
,Value
,UsesCount
),std::map
como un contenedor de iteradores al vector para el acceso asociativo ystd::make_heap
,std::push_heap
ystd::pop_heap
como implementación de cola de prioridad dentro del vector, los elementos en el mapa no son válidos después de las operaciones de pila. - Si uso
std::list
(ostd::map
) en lugar destd::vector
en la configuración anterior,std::make_heap
etc. puede no ser compilado robaba sus iteradores no soporta aritméticas. - Si me gustaría usar
std::priority_queue
, no tengo la capacidad de actualizar la prioridad del elemento.
Las preguntas son:
- Me estoy perdiendo algo obvio cómo este problema podría ser resuelto?
- ¿Puede indicarme alguna implementación pura de C++/STL de caché LFU que cumpla con los requisitos previos como ejemplo?
Gracias por su conocimiento.
"los elementos en el mapa no son válidos después de las operaciones de pila" - soluciona esto haciendo lo contrario - coloque los datos en el 'mapa', donde no se moverán incluso si se insertan otros elementos /borrado. Luego coloque los iteradores de los mapas en su vector y construya un montón de ellos. Sin embargo, es probable que aún te falte la capacidad de actualizar de manera eficiente la prioridad de un elemento, por lo que esta no es una respuesta. –
Gracias por otra idea que no se me pasó por la cabeza. Pero si tuviera iteradores 'std :: vector' de' std :: map', ¿cómo podría definir su operador de comparación, que se vería dentro del objeto de punta en el atributo 'UsesCount', para poder reparar el montón usando' std :: make_heap' después de la inserción del elemento o la actualización 'UsesCount'? – Blackhex
usando un functor de comparación como: 'bool operator() (MapIter a, MapIterB) {return a-> second.UseCount < b-> second.UseCount; } ' – Useless