LRU Cache
class LRUCache { public: /* ( 键 1 ,索引 2) 代表 key_vec[2] == 1 */ unordered_map<int, int> umap; //存放key值的vector索引 vector<int> key_vec; //存放key值 vector<int> val_vec; //存放val值 vector<list<int>::iterator> ite_vec; //存放当前key在链表中的位置 /* L: 3 1 2 5 8 7 6 4 表示 key_vec[4]最近最少被访问, key_vec[3]代表最近的访问,页面应当置换key_ve[4]*/ list<int> L; //按访问顺序存放key值的vector 索引 LRUCache(int capacity) { key_vec.resize(capacity); val_vec.resize(capacity); ite_vec.resize(capacity); //被始为空 for (int i = 0; i < capacity; i++) key_vec[i] = -1; //初始化 for (int i = 0; i < capacity; i++) L.push_back(i); } int get(int key) { //获取key值在key_vec的索引 unordered_map<int, int>::iterator c = umap.find(key); //未找到,返回-1 if (c == umap.end())return -1; //移动list,key最近被访问 /* L: 4 1 2 3 5 6 7 8 位置5被访问 L: 5 4 1 2 3 6 7 8 */ //获取key在L中位置 list<int>::iterator b = ite_vec[c->second]; //移动位置 L.insert(L.begin(), *b); L.erase(b); ite_vec[c->second] = L.begin(); return val_vec[c->second]; } void put(int key, int value) { unordered_map<int, int>::iterator c = umap.find(key); //如果键值已经存在 if (c != umap.end()) { /* L: 4 1 2 3 5 6 7 8 位置5被访问 L: 5 4 1 2 3 6 7 8 */ //最近被访问,移动链表的位置 list<int>::iterator b = ite_vec[c->second]; L.insert(L.begin(), *b); L.erase(b); ite_vec[c->second] = L.begin(); //更新键值 val_vec[c->second] = value; //不往下执行 return; } int back = L.back(); //L的尾部最少被访问,需要置换的vec下标 //清除尾部原有的内容 if (key_vec[back] != -1) { int key = key_vec[back]; unordered_map<int, int>::iterator c = umap.find(key); umap.erase(key); } //移动list list<int>::iterator b = --(L.end()); L.insert(L.begin(), *b); L.erase(b); key_vec[back] = key; val_vec[back] = value; ite_vec[back] = L.begin(); umap.insert(make_pair(key, back)); } };
原题链接:https://leetcode.com/problems/lru-cache/#/description