私は純粋なSTLを使ってLFU(Least Frequently Used)キャッシュを実装しようとしています(私はBoostを使いたくありません!)。STLを使用してLFUキャッシュを実装する方法は?
要件は以下のとおりです。std::map
と同じようKey
を使って任意の要素に
- 連想アクセス。
- 最低優先度のアイテムを解放する機能(
UsesCount
属性を使用)。 - アイテムの優先度(
UsesCount
)を更新する機能。問題がある
:
- Iアイテム(
Key
、Value
、UsesCount
)のコンテナとしてstd::vector
を使用する場合、連想アクセスとstd::make_heap
用ベクターへのイテレータの容器としてstd::map
、std::push_heap
とstd::pop_heap
ベクトル内での優先度キューの実装として、マップ内のイテレータはヒープ操作後に有効ではありません。 - 前のコンフィグレーションで
std::vector
の代わりにstd::list
(またはstd::map
)を使用すると、イテレータがaritmeticをサポートしないため、std::make_heap
などをコンパイルできません。 std::priority_queue
を使用したい場合、アイテムの優先度を更新する機能はありません。
質問は以下のとおりです。
- 私はこの問題を解決する方法を明らかに何かが足りないのですか?
- 以前の要件を満たすLFUキャッシュの純粋なC++/STL実装を例として挙げてください。
あなたの洞察をいただきありがとうございます。
「マップでitertorsがヒープ・オペレーションの後に有効ではありません」 - それを他の方法で回避を行うことによってこの問題を解決 - 他の要素が挿入されている場合でも、それが移動し得ることはありません 'map'にデータを置きます/消去されました。次に、マップイテレータをベクトルに置き、そこからヒープを構築します。しかし、アイテムの優先度を効率的に更新する機能がまだ不足している可能性があるので、これは答えではありません。 –
私の頭を越えていない別のアイデアをありがとう。しかし、もし 'std :: vector'イテレータの' std :: vector'を持っていれば、どのように 'UsesCount'属性のpointeeオブジェクトの中にある比較演算子を定義すれば' std :: make_heap'を実行するか、 'UsesCount'を更新しますか? – Blackhex
ような比較ファンクタを使用して: 'ブール演算子()(MapIter、MapIterB){> second.UseCount < b-> second.UseCount A-リターン。 } ' – Useless