LRU缓存机制(C++实现)

代码:

#include <iostream>
#include <unordered_map>
using std::unordered_map;
struct DLinkedNode
{
  int key,value;
  DLinkedNode* next;
  DLinkedNode* prev;
  DLinkedNode():key(0),value(0),next(nullptr),prev(nullptr){};
  DLinkedNode(int _key,int _value):key(_key),value(_value),next(nullptr),prev(nullptr){};
};
class LRUCache
{
private:
  unordered_map<int,DLinkedNode*> cache;
  int size;
  int capacity;
  DLinkedNode* head;
  DLinkedNode* tail;
public:
  LRUCache(int _capacity):capacity(_capacity),size(0){
    head = new DLinkedNode();
    tail = new DLinkedNode();
    head->next = tail;
    tail->prev = head;
  }

  int get(int _key){
    if(!cache.count(_key))
    {
      return -1;
    }
    else
   {
     DLinkedNode* node = cache[_key];
     moveToHead(node);
     std::cout << node->value << '\n';
     return node->value;
   }
  }
  void put(int _key,int _value)
  {
    DLinkedNode* node = new DLinkedNode(_key,_value);
    if(!cache.count(_key))
    {
      cache[_key] = node;
      addToHead(node);
      ++size;
      if(size > capacity)
      {
        DLinkedNode* node = gettailNode();
        cache.erase(node->key);
        delete node;
        --size;
      }
    }
    else
    {
      DLinkedNode* node = cache[_key];
      node->value = _value;
      moveToHead(node);
      return;
    }
  }
  void addToHead(DLinkedNode* node)
  {
    node->prev = head;
    node->next = head->next;
    head->next->prev = node;
    head->next = node;
  }
 void moveToHead(DLinkedNode* node)
 {
   removeNode(node);
   addToHead(node);
 }
 void removeNode(DLinkedNode* node)
 {
   node->prev->next = node->next;
   node->next->prev = node->prev;
 }
 DLinkedNode* gettailNode()
 {
   DLinkedNode* node = tail->prev;
   removeNode(node);
   return node;
 }
 DLinkedNode* gethead()
 {
   return head;
 }
};
int main()
{
  LRUCache cache(4);
  cache.put(1,1);
  cache.put(2,2);
  cache.put(3,3);
  cache.put(4,4);
  cache.put(5,5);
  cache.get(1);
  cache.get(3);
  cache.get(5);
  DLinkedNode* tem = cache.gethead();
  while (tem) {
    std::cout << tem->value << ' ';
    tem = tem->next;
  }
}
 
测试结果:
 

 

 

posted @ 2020-08-27 16:18  诗和远方*  阅读(663)  评论(0编辑  收藏  举报