146. LRU缓存机制*【力扣】

题意理解

设计一个最近最少使用的LRU缓冲机制的类

问题分析

使用STL

unordered_map,list。

list用于缓冲区;map用于查询元素位置。

其他

链接

class LRUCache {
private:
    unordered_map<int, list<pair<int, int>>::iterator> myDict; 
    list<pair<int,int>> myList;
    int cap = 0;
public:
    LRUCache(int capacity) {
        cap = capacity;
    }
    
    int get(int key) {
        auto dict_it = myDict.find (key);
        //cout << "--1--" << endl;
        if (dict_it == myDict.end()) { //没找到
            //cout << -1 << endl;
            return -1;
        }
        //cout << "--2--" << endl;
        auto list_it = dict_it -> second;
        //cout << "--22--" << endl;
        int val = list_it -> second;
        //cout << "--3--" << endl;
        myList.erase(list_it);
        //cout << "--4--" << endl;
        myList.push_front(pair<int, int>(key, val));
        myDict[key] = myList.begin();
        
        return val;
    }
    
    void put(int key, int value) {
        auto dict_it = myDict.find (key);
        if (dict_it != myDict.end()) { //找到了
            auto list_it = dict_it -> second;
            int val = list_it -> second;
            myList.erase(list_it);
            myList.push_front(pair<int, int>(key, value));
            myDict[key] = myList.begin();
        }
        else {
            if (myList.size() >= cap) {
                auto end_it = myList.begin();
                advance(end_it, (int)myList.size() -1);
                myDict.erase(end_it -> first);
                myList.erase(end_it);                
            }
            myList.push_front(pair<int,int>(key,value));
            myDict[key] = myList.begin();
        }
        /*
        cout << "list" << endl;
        for (auto p : myList) {
            cout << p . first << '\t' << p . second << endl;
        }        
        cout << endl;
        cout << "dict" <<endl;
        for (auto p : myDict) {
            cout << p . first << "\t";
        }
        cout << endl;
        */        
    }
};

 

点赞