Skip to content

Commit 3d2cf44

Browse files
committed
Create LRUCache.cc
1 parent fe149b4 commit 3d2cf44

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

LRUCache.cc

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
class LRUCache{
2+
public:
3+
LRUCache(int capacity) {
4+
_cache_map.clear();
5+
_cache_list.clear();
6+
_max_size = capacity;
7+
}
8+
9+
int get(int key) {
10+
unordered_map<int, list<pair<int, int> >::iterator >::iterator p = _cache_map.find(key);
11+
if (p != _cache_map.end()) {
12+
//_cache_list.erase(p->second);
13+
//_cache_list.push_front(pair<int, int>(key, ret));
14+
_cache_list.splice(_cache_list.begin(), _cache_list, p->second);
15+
p->second = _cache_list.begin();
16+
return (p->second)->second;
17+
}
18+
return -1;
19+
}
20+
21+
void set(int key, int value) {
22+
unordered_map<int, list<pair<int, int> >::iterator >::iterator p = _cache_map.find(key);
23+
if (p != _cache_map.end()) {
24+
//_cache_list.erase(p->second);
25+
//_cache_list.push_front(pair<int, int>(key, value));
26+
((p->second))->second = value;
27+
_cache_list.splice(_cache_list.begin(), _cache_list, p->second);
28+
p->second = _cache_list.begin();
29+
} else {
30+
if (_cache_map.size() >= _max_size) {
31+
_cache_map.erase(_cache_list.rbegin()->first);
32+
_cache_list.pop_back();
33+
}
34+
_cache_list.push_front(pair<int, int>(key, value));
35+
_cache_map[key] = _cache_list.begin();
36+
}
37+
}
38+
private:
39+
unordered_map<int, list<pair<int, int> >::iterator > _cache_map; //key, _cache_list iterator
40+
list<pair<int, int> > _cache_list; // KV pair container
41+
int _max_size;
42+
};

0 commit comments

Comments
 (0)