LeetCode_LRU Cache(待完善)

class LRUCache{ 
    public:
        LRUCache(int capacity) {
            max_size = capacity;
            cur_size = 0;
        }


        int get(int key) {
            auto it = cache_map.find(key);
            if (it != cache_map.end()) {
                // update queue
                int value = it->second->second;
                cache_list.erase(it->second);
                cache_map[key] = cache_list.insert(cache_list.end(), make_pair(key, value));
                return value;
            }
            else
                return -1;
        }


        void set(int key, int value) {
            if (get(key) < 0) {
                // no such key, do insertion
                if (cur_size == max_size) {
                    int old = cache_list.front().first;
                    cache_list.pop_front();
                    cache_map.erase(old);
                }
                else
                    cur_size++;
                cache_list.push_back(make_pair(key, value));
            }
            cache_list.pop_back();


            // here we play a trick to get the iterator of the queue back
            cache_map[key] = cache_list.insert(cache_list.end(), make_pair(key, value));
        }


    private:
        int cur_size;
        int max_size;
        unordered_map<int, list<pair<int, int> >::iterator> cache_map; // key + list iterator
        list<pair<int, int> > cache_list; // key + values
    };


你可能感兴趣的:(LeetCode)