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;
}
posted @ 2022-08-31 10:01  ADRUI  阅读(94)  评论(0)    收藏  举报