栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++实现LRU算法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++实现LRU算法

#include
#include
#include
using namespace std;

struct DLinkedNode {
    int key;
    int value;
    DLinkedNode* pre;
    DLinkedNode* next;
    DLinkedNode() :key(0), value(0), pre(nullptr), next(nullptr) {};
    DLinkedNode(int _key, int _value) :key(_key), value(_value), pre(nullptr), next(nullptr) {};
};

class LRUCache
{
private:
    unordered_map cache;
    DLinkedNode* head;
    DLinkedNode* tail;
    int size;
    int capacity;
public:
    LRUCache(int _capacity)
    {
        capacity = _capacity;
        size = 0;
        head = new DLinkedNode();
        tail = new DLinkedNode();
        head->next = tail;
        tail->pre = head;
    }
    int get(int key)
    {
        //key不存在则返回-1;存在则将节点移至最前
        if (!cache.count(key))
            return -1;
        else
            MoveToHead(cache[key]);
        return cache[key]->value;
    }
    void put(int key, int value)
    {
        //key存在则变更为要替换的值,并将节点移至最前
        if (cache.count(key))
        {
            cache[key]->value = value;
            MoveToHead(cache[key]);
        }
        //key不存在,则在头节点后添加新节点
        else
        {
            DLinkedNode* node = new DLinkedNode(key, value);
            cache[key] = node;
            addHead(node);
            size++;
            //如果超出容量则删除最后一个节点
            if (size > capacity)
            {
                //因为是new出来的对象,所以要先记录节点,然后再释放掉
                DLinkedNode* removed = RemoveLast();
                cache.erase(removed->key);
                delete removed;
                size--;
            }
        }
    }
    //删除节点
    void removeNode(DLinkedNode* node)
    {
        node->pre->next = node->next;
        node->next->pre = node->pre;
    }
    //添加头节点
    void addHead(DLinkedNode* node)
    {
        head->next->pre = node;
        node->next = head->next;
        head->next = node;
        node->pre = head;
    }
    //节点移至最前
    void MoveToHead(DLinkedNode* node)
    {
        removeNode(node);
        addHead(node);
    }
    //删除最后一个节点
    DLinkedNode* RemoveLast()
    {
        DLinkedNode* node = tail->pre;
        removeNode(node);
        return node;
    }
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/832826.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号