class LRUCache { private: std::unordered_map<int, int> mapData; std::unordered_map<int, std::list<int>::iterator> mapIndex; std::list<int> list; int maxSize; public: LRUCache(int capacity) { maxSize = capacity; } int get(int key) { auto search = mapData.find(key); if (search != mapData.end()) {//find it auto pair_delete = mapIndex.find(key); list.erase(pair_delete->second); list.push_back(key); pair_delete->second = std::prev(list.end()); return search->second; } else {//not find return -1; } } void put(int key, int value) { auto search = mapData.find(key); if (search != mapData.end()) {//find it auto pair_delete = mapIndex.find(key); list.erase(pair_delete->second); list.push_back(key); pair_delete->second = std::prev(list.end()); search->second = value; } else {//not find //push to list list.push_back(key); mapData[key] = value; mapIndex[key] = std::prev(list.end()); //overflow this->removeLRU(); } } void removeLRU() { if (list.size() > maxSize) { auto iterBegin = list.begin(); mapData.erase(*iterBegin); mapIndex.erase(*iterBegin); list.pop_front(); } } };