Advertisement
seulunga

Untitled

Feb 18th, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.53 KB | None | 0 0
  1. #include <iostream>
  2. #include <list>
  3. #include <unordered_map>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. class LRUCache {
  9. public:
  10.   LRUCache(int capacity) : capacity_(capacity) {
  11.   }
  12.  
  13.   int get(int key) {
  14.     auto it = key_to_it_.find(key);
  15.     if (it == key_to_it_.end()) {
  16.       return -1;
  17.     }
  18.     pair<int, int> p = *(it->second);
  19.     // bump priority.
  20.     key_values_.erase(it->second);
  21.     key_to_it_[key] = key_values_.insert(key_values_.begin(), p);
  22.     return p.second;
  23.   }
  24.  
  25.   void put(int key, int value) {
  26.     auto it = key_to_it_.find(key);
  27.     if (it != key_to_it_.end()) {
  28.       // erase from key_values_
  29.       key_values_.erase(it->second);
  30.     }
  31.     // Purge old entries.
  32.     if (key_values_.size() >= capacity_) {
  33.       const pair<int, int>& p = key_values_.back();
  34.       auto it2 = key_to_it_.find(p.first);
  35.       __glibcxx_assert(it2 != key_to_it_.end());
  36.       key_to_it_.erase(it2);
  37.       key_values_.pop_back();
  38.     }
  39.     key_to_it_[key] = key_values_.insert(key_values_.begin(), {key, value});
  40.   }
  41.  
  42. private:
  43.   list<pair<int, int>> key_values_;
  44.   unordered_map<int, list<pair<int, int>>::iterator> key_to_it_;
  45.   int capacity_;
  46. };
  47.  
  48. int main() {
  49.   LRUCache cache(2 /* capacity */);
  50.  
  51.   cache.put(1, 1);
  52.   cache.put(2, 2);
  53.   cache.get(1);    // returns 1
  54.   cache.put(3, 3); // evicts key 2
  55.   cache.get(2);    // returns -1 (not found)
  56.   cache.put(4, 4); // evicts key 1
  57.   cache.get(1);    // returns -1 (not found)
  58.   cache.get(3);    // returns 3
  59.   cache.get(4);    // returns 4
  60.   return 0;
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement