運用你所掌握的資料結構,設計和實現乙個lru(最近最少使用)快取機制。它應該支援以下操作:獲取資料get
和寫入資料put
。
獲取資料get(key)
- 如果關鍵字(key)存在於快取中,則獲取關鍵字的值(總是正數),否則返回-1.
寫入資料put(key, value)
- 如果關鍵字已經存在,則變更其資料值;如果關鍵字不存在,則插入該組 [關鍵字/值] 。當快取容量達到上限時,他應該在寫入新資料之前刪除最久未使用的資料值,從而為新資料值留出空間。
#include
#include
using
namespace std;
template
<
class
key,
class
value
>
struct doublelistnode
};
然後是鍊錶的實現:
template
<
class
key,
class
value
>
class
doublelinkedlist
__iterator
(nodetype *node)
:m_node
(node)
__iterator
(const __iterator &rhs)
:m_node
(rhs.m_node)
// 等於運算子
bool
operator==(
const __iterator &rhs)
const
// 不等於運算子
bool
operator!=(
const __iterator &rhs)
const
// 解引用運算子
value&
operator*(
)const
// 獲取所指節點的key
key key()
const
// 獲取所指節點的value
value value()
const
// 為了能夠讓鍊錶能夠訪問私有資料成員
friend
class
doublelinkedlist
;};private
:
size_t m_len;
nodetype *m_head;
nodetype *m_tail;
public
:doublelinkedlist()
:m_len(0
),m_head
(nullptr),
m_tail
(nullptr)~
doublelinkedlist()
iterator begin()
const
iterator end()
const
bool
empty()
const
size_t length()
const
// 在頭部插入
iterator insertfront
(const keytype &key,
const valuetype &value)
// 將迭代器所指元素移到頭部
void
movetofront
(iterator iter)
// 尾元素
iterator back()
const
// 刪除尾元素
void
removeback()
// 鍊錶有多個元素
else
--m_len;
}private
:// 在頭部插入節點
void
insertfront
(nodetype *pnode)
++m_len;
}// 將指標所指元素刪除但是並不釋放其空間
void
remove
(nodetype *pnode)
};
最後是lru的實現:
template
<
class
key,
class
value
>
class
lrucache
~lrucache()
value get
(const key &key,
bool
&isok)
// 如果不存在該key
isok =
false
;return
value()
;}void
put(
const key &key,
const value &value)
// 如果不存在該key
// 如果快取已滿
if(m_list.
length()
== m_capacity)
auto iter = m_list.
insertfront
(key, value)
;
m_cache[key]
= iter;}}
;
測試**:
int
main()
測試結果為:
LRU快取機制實現
題目描述 設計lru快取結構,該結構在構造時確定大小,假設大小為k,並有如下兩個功能 set key,value 將記錄 key,value 插入該結構 get key 返回key對應的value值 要求 set和get方法的時間複雜度為o 1 某個key的set或get操作一旦發生,認為這個key...
LRU快取機制演算法實現
就是一種快取淘汰策略。計算機的快取容量有限,如果快取滿了就要刪除一些內容,給新內容騰位置。但問題是,刪除哪些內容呢?我們肯定希望刪掉哪些沒什麼用的快取,而把有用的資料繼續留在快取裡,方便之後繼續使用。那麼,什麼樣的資料,我們判定為 有用的 的資料呢?lru 快取淘汰演算法就是一種常用策略。lru 的...
LRU快取機制
運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料 put key,value 如果金鑰不存在,則寫入其資料值。...