|
| 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