LRU

#include <iostream>
#include <list>
#include <unordered_map>

struct Node
{
  int v_;
  Node(int v) : v_(v) {}
};
class LRU
{
public:
  LRU(int capacity) : capacity_(capacity), size_(0) {}
  void deleteTail()
  {
    Node &cur = *elems_.rbegin();
    mp_.erase(cur.v_);
    elems_.pop_back();
    --size_;
  }
  void insertHead(Node &tmp)
  {
    elems_.push_front(tmp);
    ++size_;
    mp_[tmp.v_] = elems_.begin();
  }
  void insert(int v)
  {
    Node cur(v);
    if (size_ == capacity_)
    {
      deleteTail();
    }
    insertHead(cur);
  }
  void out()
  {
    for (auto &v : elems_)
    {
      std::cout << v.v_ << ' ';
    }
    // std::cout << std::endl;
    std::cout << "\t [mp size] : " << mp_.size() << std::endl;
  }
  void query(int x)
  {
    if (mp_.find(x) != mp_.end())
    {
      elems_.erase(mp_[x]);
      --size_;
    }
    insert(x);
  }

private:
  std::list<Node> elems_;
  std::unordered_map<int, std::list<Node>::iterator> mp_;
  int capacity_;
  int size_;
};

int main()
{
  LRU demo(4);
  demo.query(2);
  demo.out();
  demo.query(3);
  demo.out();
  demo.query(1);
  demo.out();
  demo.query(4);
  demo.out();
  demo.query(5);
  demo.out();
  demo.query(3);
  demo.out();
  demo.query(5);
  demo.out();
  demo.query(4);
  demo.out();
  return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值