LRU cache算法实现。
数据结构:hashmap 和 双向链表
#include <iostream>
#include <list>
#include <unordered_map>
//被注释部分是判断大端小端的代码
//union{
// short s;
// char a[sizeof(short)];
//}un;
//
//using namespace std;
//
//int main()
//{
// un.s = 0x0102;
// if (sizeof(short) == 2){
// if (un.a[0] == 1 && un.a[1] == 2)
// cout << "big endian" << endl;
// else if (un.a[0] == 2 && un.a[1] == 1)
// cout << "little endian" << endl;
// }
// return 0;
//}
using namespace std;
struct CacheNode{
int key;
int value;
CacheNode(int k, int val) :key(k), value(val){}
};
class LRUCache{
public:
LRUCache(int capacity) {
size = capacity;
}
int get(int key) {
if (cacheMap.find(key) == cacheMap.end()){
return -1;
}
else{
cacheList.splice(cacheList.begin(), cacheList, cacheMap[key]);
cacheMap[key] = cacheList.begin();
return cacheMap[key]->value;
}
}
void set(int key, int value) {
if (cacheMap.find(key) == cacheMap.end()){
if (cacheList.size() == size){
cacheMap.erase(cacheList.back().key);
cacheList.pop_back();
}
CacheNode node(key, value);
cacheList.push_front(node);
cacheMap[key] = cacheList.begin();
}
else{
cacheMap[key]->value = value;
cacheList.splice(cacheList.begin(), cacheList, cacheMap[key]);
cacheMap[key] = cacheList.begin();
}
}
private:
unordered_map<int, list<CacheNode>::iterator> cacheMap;
list<CacheNode> cacheList;
int size;
};