Guest User

LRUCache

a guest
Sep 15th, 2025
26
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.68 KB | None | 0 0
  1. class LRUCache {
  2.     template<typename T>
  3.     class my_deque {
  4.     public:
  5.         class deque_element {
  6.         public:
  7.             deque_element(T val, deque_element *nxt) : value(val), next(nxt) {
  8.             }
  9.             deque_element *previous = nullptr;
  10.             deque_element *next = nullptr;
  11.             T value;
  12.         };
  13.  
  14.         deque_element *head = nullptr;
  15.         deque_element *tail = nullptr;
  16.         std::size_t size{};
  17.  
  18.         T back() {
  19.             return tail->value;
  20.         }
  21.  
  22.         void pop_back() {
  23.             auto current_tail = tail;
  24.             if (tail) {
  25.                 if (tail->previous) {
  26.                     tail = tail->previous;
  27.                     tail->next = nullptr;
  28.                 } else {
  29.                     head = nullptr;
  30.                     tail = nullptr;
  31.                 }
  32.  
  33.                 delete current_tail;
  34.                 --size;
  35.             }
  36.         };
  37.  
  38.         void erase(deque_element *elem) {
  39.             if (elem->previous != nullptr && elem->next != nullptr) {
  40.                 elem->previous->next = elem->next;
  41.                 elem->next->previous = elem->previous;
  42.             }
  43.  
  44.             if (elem->previous != nullptr && elem->next == nullptr) {
  45.                 tail = elem->previous;
  46.                 tail->next = nullptr;
  47.             }
  48.  
  49.             if (elem->next != nullptr && elem->previous == nullptr) {
  50.                 head = elem->next;
  51.                 head->previous = nullptr;
  52.             }
  53.  
  54.             if (elem->previous == nullptr && elem->next == nullptr) {
  55.                 head = nullptr;
  56.                 tail = nullptr;
  57.             }
  58.  
  59.             delete elem;
  60.             --size;
  61.         }
  62.  
  63.         void emplace_front(T value) {
  64.             deque_element *current_deque = new deque_element(value, head);
  65.             if (head != nullptr) {
  66.                 head->previous = current_deque;
  67.             }
  68.             head = current_deque;
  69.  
  70.             if (tail == nullptr) {
  71.                 tail = current_deque;
  72.             }
  73.  
  74.             ++size;
  75.         }
  76.     };
  77.  
  78.     template<typename T> using ptr_to_deque_elem = typename my_deque<T>::deque_element*;
  79.  
  80.     const std::size_t available_size;
  81.     my_deque<int> elements;
  82.     std::unordered_map<int, std::pair<int, ptr_to_deque_elem<int>>> cache;
  83. public:
  84.     LRUCache(int capacity) :
  85.         available_size(static_cast<std::size_t>(capacity)),
  86.         cache(std::unordered_map<int, std::pair<int, ptr_to_deque_elem<int>>>{}),
  87.         elements(my_deque<int>{})
  88.     {
  89.     }
  90.  
  91.     int get(int key) {
  92.         auto elem = cache.find(key);
  93.         if (elem != cache.end()) {
  94.             elements.erase(elem->second.second);
  95.             elements.emplace_front(key);
  96.  
  97.             elem->second.second = elements.head;
  98.  
  99.             return elem->second.first;
  100.         }
  101.  
  102.         return -1;
  103.     }
  104.  
  105.     void put(int key, int value) {
  106.         auto elem = cache.find(key);
  107.         if (elem != cache.end()) {
  108.             elements.erase(elem->second.second);
  109.             elements.emplace_front(key);
  110.             elem->second.first = value;
  111.             elem->second.second = elements.head;
  112.  
  113.             return;
  114.         }
  115.  
  116.         if (elements.size == available_size) {
  117.             cache.erase(elements.back());
  118.             elements.pop_back();
  119.         }
  120.  
  121.         elements.emplace_front(key);
  122.         cache.insert(std::make_pair(key, std::make_pair(value, elements.head)));
  123.     }
  124. };
Advertisement
Add Comment
Please, Sign In to add comment