1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| #include <iostream> #include <vector> #include <unordered_map> using namespace std;
class LRUCache { public: LRUCache(int capacity) { this->capacity = capacity; head = new Node(), tail = new Node(); head->next = tail, tail->prev = head; }
int get(int key) { if (!cache.count(key)) { return -1; } Node* p = cache[key]; removeNode(p); addNode(p); return p->val; } void put(int key, int value) { if (!cache.count(key)) { if (cache.size() == capacity) { Node* p = tail->prev; removeNode(p); cache.erase(p->key); delete p; } Node* p = new Node(key, value); addNode(p); cache[key] = p; } else { Node* p = cache[key]; p->val = value; removeNode(p); addNode(p); } }
private: struct Node { int key, val; Node *prev, *next; Node() : key(-1), val(-1), prev(nullptr), next(nullptr) {} Node(int k, int v) : key(k), val(v), prev(nullptr), next(nullptr) {} }; Node *head, *tail; unordered_map<int, Node*> cache; int capacity;
void addNode(Node* p) { p->prev = head; p->next = head->next; head->next->prev = p; head->next = p; }
void removeNode(Node* p) { p->next->prev = p->prev; p->prev->next = p->next; } };
int main() { LRUCache cache(2); cache.put(1, 1); cache.put(2, 2); cout << cache.get(1) << endl; cache.put(3, 3); cout << cache.get(2) << endl; cache.put(4, 4); cout << cache.get(1) << endl; cout << cache.get(3) << endl; cout << cache.get(4) << endl;
return 0; }
|