Ich versuche, LFU (Least Frequently Used) -Cache mit reiner STL zu implementieren (ich möchte Boost nicht verwenden!).Wie LFU-Cache mit STL zu implementieren?
Anforderungen sind:
- Assoziative Zugriff auf jedes Element mit
std::map
einKey
dergleichen. - Möglichkeit, den Artikel mit der niedrigsten Priorität freizugeben (unter Verwendung seines
UsesCount
Attributs). - Möglichkeit, die Priorität (
UsesCount
) eines beliebigen Elements zu aktualisieren.
Die Probleme sind:
- Wenn I
std::vector
als Behälter der Elemente verwenden (Key
,Value
,UsesCount
),std::map
als Behälter von Iteratoren zum Vektor für assoziativen Zugriff undstd::make_heap
,std::push_heap
undstd::pop_heap
Als Implementierung der Prioritätswarteschlange innerhalb des Vektors sind die Iteratoren in der Zuordnung nach Heap-Operationen nicht gültig. - Wenn ich
std::list
(oderstd::map
) stattstd::vector
in der vorherige Konfiguration,std::make_heap
etc. nicht becasue ihre Iteratoren kompiliert wird nicht aritmetic unterstützen. - Wenn ich
std::priority_queue
verwenden möchte, kann ich die Artikelpriorität nicht aktualisieren.
Die Fragen sind:
- Fehle ich etwas offensichtlich, wie dieses Problem gelöst werden könnte?
- Können Sie mich auf eine reine C++/STL-Implementierung des LFU-Caches hinweisen, die den vorherigen Anforderungen als Beispiel entspricht?
Vielen Dank für Ihre Einblicke.
"die Iteratoren in der Karte sind nach Heap-Operationen nicht gültig" - behebe dies, indem du es anders herum machst - lege die Daten in die 'map', wo sie nicht verschoben wird, selbst wenn andere Elemente eingefügt werden/gelöscht. Fügen Sie dann Map-Iteratoren in Ihren Vektor ein und erstellen Sie einen Heap daraus. Sie werden wahrscheinlich immer noch die Möglichkeit verpassen, die Priorität eines Elements effizient zu aktualisieren, also ist dies keine Antwort. –
Danke für eine andere Idee, die mir nicht in den Sinn kommt. Aber wenn ich 'std :: vector' von' std :: map'-Iteratoren hätte, wie könnte ich ihren Vergleichsoperator definieren, der innerhalb des Referenzobjekts im 'UsesCount'-Attribut nachsehen würde, um den Heap mit' zu fixieren std :: make_heap' nach dem Einfügen von Artikeln oder 'UsesCount' update? – Blackhex
mit einem Vergleichsfunktor wie: 'bool operator() (MapIter a, MapIterB) {return a-> second.UseCount second.UseCount; } ' – Useless