LRU C++实现

本文介绍了一种使用C++实现的LRU(Least Recently Used)缓存算法。该算法结合了哈希表和双向链表的数据结构,通过具体代码展示了如何在限定容量下进行数据的增删操作,并保持最近最少使用的数据能够被及时淘汰。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <string>
#include <unordered_map>
#include <list>
using namespace std;



typedef struct TNodeTab
{
    string value;
    int key;
}TNode;

class Lru
{
public:
    bool put(TNode node)
    {
        auto res = m_map.find(node.key);
        if(res != m_map.end())//key已存在,擦除已存在的数据
        {
            auto  ptr = res->second;//返回list::iterator
            m_list.erase(ptr);
        }
        if(size >= 5)
        {
            m_map.erase(m_list.back().key);//擦除map中的记录
            m_list.pop_back();擦除list中的记录
            size = 4;

        }
        m_list.push_front(node);
        m_map[node.key] = m_list.begin();//如果key存在,更新iterator,否则插入
        size++;
        for(auto i:m_list)
        {
            cout<<i.value<<"";
        }
        cout<<endl;
    };

    bool get(TNode node,TNode& resNode)
    {
        auto res = m_map.find(node.key);
        if(res == m_map.end())
            return false;
        resNode = *(res->second);//返回指向list中数据的iterator
        m_list.splice(m_list.begin(),m_list,res->second);//把这个指针指向最list最前端

        for(auto i:m_list)
        {
            cout<<i.value<<"";
        }
        cout<<endl;
    };
private:
    unordered_map<int,list<TNode>::iterator> m_map;
    list<TNode> m_list;
    uint32_t size;
public:
    Lru(){};
    ~Lru(){};
};

int main()
{
    Lru lru;
    TNode node[8];
    node[0].key =1;
    node[0].value ="a";
    node[1].key =2;
    node[1].value ="b";
    node[2].key =3;
    node[2].value ="c";
    node[3].key =4;
    node[3].value ="d";
    node[4].key =5;
    node[4].value ="e";
    node[5].key =6;
    node[5].value ="f";
    node[6].key =7;
    node[6].value ="g";

    lru.put(node[0]);
    lru.put(node[1]);
    lru.put(node[2]);
    lru.put(node[3]);
    lru.put(node[4]);

    lru.put(node[5]);
    lru.put(node[6]);

    lru.get(node[3],node[7]);

    // lru.put(node[6]);

    // lru.get(node[2],node[7]);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值