我正在嘗試使用純STL實現LFU(Least Frequently Used)緩存(我不想使用Boost!)。如何使用STL實現LFU緩存?
要求是:
- 到任何元件關聯的訪問使用
Key
像std::map
。 - 能夠釋放最低優先級項目(使用其
UsesCount
屬性)。 - 能夠更新任何項目的優先級(
UsesCount
)。
的問題是:
- 如果我使用
std::vector
作爲std::map
項的容器(Key
,Value
,UsesCount
),作爲迭代器的用於關聯存取和std::make_heap
,std::push_heap
和std::pop_heap
該載體的容器作爲向量中的優先級隊列實現,映射中的迭代器在堆操作後無效。 - 如果我在前面的配置中使用
std::list
(或std::map
)而不是std::vector
,則std::make_heap
等無法編譯,因爲它們的迭代器不支持aritmetic。 - 如果我想使用
std::priority_queue
,我無法更新項目優先級。
的問題是:
- 我失去了一些東西很明顯這個問題如何解決?
- 你能指點我一些滿足以前需求的LFU緩存的純C++/STL實現嗎?
謝謝你的見解。
「堆映射中的迭代器在堆操作後無效」 - 通過其他方式解決此問題 - 將數據放入映射中,即使插入了其他元素也不會移動/擦除。然後把map迭代器放到你的向量中,並從中構建一個堆。儘管如此,你可能仍然缺少有效更新項目優先級的能力,所以這不是一個答案。 – 2012-07-10 08:47:17
謝謝你的另一個想法,我不介意。但是如果我有'std :: map'迭代器的'std :: vector',我怎麼能夠定義它們的比較運算符,它會在'UsesCount'屬性中查看指針對象的內部,以便能夠使用'項目插入後或「UsesCount」更新後的std :: make_heap'? – Blackhex 2012-07-10 08:52:55
使用比較函數,如:bool operator()(MapIter a,MapIterB){return a-> second.UseCount < b-> second.UseCount; }' – Useless 2012-07-10 09:10:50