#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;
}
LRU
最新推荐文章于 2023-03-13 09:31:23 发布