• 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 << ' ';
         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;
      }
    }
     
    测试结果:
     
  • 相关阅读:
    两个类重复属性值复制
    IIS请求筛选模块被配置为拒绝超过请求内容长度的请求
    System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本问题
    Oracle 查询表中字段里数据是否有重复
    JS 中如何将<br/> 替换成 /n
    JS 验证数组中是否包含重复元素
    [C#] 使用NPOI将Datatable保存到Excel
    [C#] 将 List 转 DataTable
    [C#] 图文解说调用WebServer实例
    bzoj 3489: A simple rmq problem
  • 原文地址:https://www.cnblogs.com/shiheyuanfang/p/13572105.html
Copyright © 2020-2023  润新知