Sto provando ad implementare la cache LFU (Least Frequently Used) usando puro STL (non voglio usare Boost!).Come implementare la cache LFU usando STL?
I requisiti sono:
- l'accesso a qualsiasi elemento associativo utilizzando un
Key
come constd::map
. - Possibilità di rilasciare l'elemento con priorità più bassa (utilizzando l'attributo
UsesCount
). - Possibilità di aggiornare la priorità (
UsesCount
) di qualsiasi articolo.
I problemi sono:
- Se uso
std::vector
come contenitore di oggetti (Key
,Value
,UsesCount
),std::map
come contenitore di iteratori al vettore di accesso associative estd::make_heap
,std::push_heap
estd::pop_heap
come implementazione della coda di priorità all'interno del vettore, gli itertori nella mappa non sono validi dopo le operazioni di heap. - Se uso
std::list
(ostd::map
) anzichéstd::vector
nella configurazione precedente,std::make_heap
ecc può non essere compilato becasue loro iteratori non supporta aritmetici. - Se desidero utilizzare
std::priority_queue
, non è possibile aggiornare la priorità dell'elemento.
Le domande sono:
- mi sto perdendo qualcosa di ovvio come questo problema potrebbe essere risolto?
- Potete indicarmi qualche pura implementazione C++/STL di cache LFU che soddisfi i requisiti precedenti come esempio?
Grazie per i vostri approfondimenti.
"gli itertori nella mappa non sono validi dopo operazioni di heap" - risolvi questo facendo il contrario - inserisci i dati nella 'mappa', dove non verrà spostato anche se sono inseriti altri elementi/cancellata. Quindi inserisci gli iteratori di mappe nel vettore e creane un mucchio. Probabilmente mancherà comunque la possibilità di aggiornare in modo efficiente la priorità di un oggetto, quindi questa non è una risposta. –
Grazie per un'altra idea che non mi è venuta in mente. Ma se avessi 'std :: vector' di' std :: map' iterators, come potrei definire il loro operatore di confronto, che guarderebbe all'interno dell'oggetto pointee nell'attributo 'UsesCount', per poter riparare l'heap usando' std :: make_heap' dopo l'inserimento dell'articolo o l'aggiornamento 'UsesCount'? – Blackhex
utilizzando un functor di comparazione come: 'bool operator() (MapIter a, MapIterB) {return a-> second.UseCount < b-> second.UseCount; } ' – Useless