leetcode 146 LRU快取機制

2021-10-07 05:17:26 字數 3254 閱讀 3362

// 標頭檔案

class

lrucache

;

// 

// // 雜湊表 + 雙向鍊錶

lrucache::

lrucache

(int capacity)

// std::unordered_map>::iterator> table;

// std::list> lru;

int lrucache::

get(

int key)

return-1

;}void lrucache::

put(

int key,

int value)

lru.

emplace_front

(key, value)

; table[key]

= lru.

begin()

;if(table.

size()

> capacity)

// 取size不要用list::size() 在c++裡這個方法可能不是o(1)的

}

list::splice的用法和 emplace

/*

list::splice實現list拼接的功能。將源list的內容部分或全部元素刪除,拼插入到目的list。

函式有以下三種宣告:

一:void splice ( iterator position, list& x );

二:void splice ( iterator position, list& x, iterator it );

三:void splice ( iterator position, list& x, iterator first, iterator last );

解釋:position 是要操作的list物件的迭代器

list&x 被剪的物件

對於一:會在position後把list&x所有的元素到剪接到要操作的list物件(會將x全部裁切到list中,並且清空x,在position之前)

對於二:只會把it的值剪接到要操作的list物件中(只裁切乙個元素)

對於三:把first 到 last 剪接到要操作的list物件中(裁切乙個範圍。x裡需要被移動的元素的迭代器。區間為[first, last).)

*/void

splice()

; std::list<

int>

::iterator it;

for(

int i =

1; i <4;

++i)

it = list1.

begin()

;++it;

// point to 2

list1.

splice

(it, list2)

;// 將list2的元素插入到it前面,清空list2的元素

printlist

(list1)

;// 1 10 20 2 3

printlist

(list2)

;// empty

#ifdef allow_print

std::cout <<

*it << std::endl;

// 2 還指向這個元素

#endif

list2.

splice

(list2.

begin()

, list1, it)

;printlist

(list1)

;// 1 10 20 3

printlist

(list2)

;// 2

// 此時it迭代器失效了???但是還能列印值

#ifdef allow_print

std::cout <<

*it << std::endl;

// 2

#endif

it = list1.

begin()

;advance

(it,2)

;// 迭代器遞增函式,it指向20

list1.

splice

(list1.

begin()

, list1, it, list1.

end())

;printlist

(list1)

;// 20 3 1 10

it = list1.

begin()

;advance

(it,2)

;// it指向1

std::list<

int>

::iterator it2 = list2.

end();

list2.

splice

(list2.

end(

), list1, it, list1.

end())

;// 插入的位置可以是end()迭代器

printlist

(list1)

;// 20 3

printlist

(list2)

;// 2 1 10

}// 當呼叫push或insert成員函式時,我們將元素型別的物件傳遞給它們,這些物件被拷貝到容器中。

// 而當我們呼叫乙個emplace成員函式時,則是將引數傳遞給元素型別的建構函式。emplace成員使用這些引數在容器管理的記憶體空間中直接構造元素。

// emplace相關函式可以減少記憶體拷貝和移動。當插入rvalue,它節約了一次move構造,當插入lvalue,它節約了一次copy構造。

void

emplace()

; list1.

emplace

(list1.

begin()

,222);

printlist

(list1)

;// 222 1 2 3 4 5

list1.

emplace_back

(333);

printlist

(list1)

;// 222 1 2 3 4 5 333

list1.

emplace_front

(111);

printlist

(list1)

;// 111 222 1 2 3 4 5 333

}

學渣帶你刷Leetcode146 LRU快取機制

運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料 put key,value 如果金鑰已經存在,則變更其資料值...

leetcode146 LRU快取機制

運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料 put key,value 如果金鑰不存在,則寫入其資料值。...

LeetCode 146 LRU快取機制

運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料get和 寫入資料put。獲取資料get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料put key,value 如果金鑰不存在,則寫入其資料值。當快取容量...