以结构体+双哈希表实现
#include <list>
#include <unordered_map>
#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * lfu design
     * @param operators int整型vector<vector<>> ops
     * @param k int整型 the k
     * @return int整型vector
     */
    //建立节点
    struct Node{
        int freq;
        int key;
        int val;
        Node(int freq,int key,int val):freq(freq),key(key),val(val){}
    };
    //key到节点的哈希表
    std::unordered_map<int, std::list<Solution::Node>::iterator> mp;
    //频率与双向链表的哈希表
    std::unordered_map<int, std::list<Solution::Node>> freq_mp;
    int size=0;
    int min_freq=0;
    vector<int> LFU(vector<vector<int> >& operators, int k) {
        // write code here
        vector<int> res;
        size=k;
        for(auto v:operators){
            if(v[0]==1){
                //set
                set(v[1],v[2]);
            }else{
                //get
                res.push_back(get(v[1]));   
            }
        }
        return res;
    }
    void set(int key,int value){
        auto it=mp.find(key);
        if(it != mp.end()){
            //若哈希表中有,则更新值与频率
            updata(it->second,key,value);
        }else{
            //哈希表中没有该节点,则链表中没有该节点
            if(size==0){//没有容量
                //满容量取频率最低且最早的删除
                int oldkey=freq_mp[min_freq].back().key;
                //频率哈希表的链表中删除
                freq_mp[min_freq].pop_back();
                if(freq_mp[min_freq].empty()){
                    freq_mp.erase(min_freq);
                }
                //哈希表中删除
                mp.erase(oldkey);
            }
            //若有空闲则直接加入,容量减1
            else size--;
            //最小频率置为1
            min_freq=1;
            //在频率为1的双向链表表头插入该键
            freq_mp[1].push_front(Solution::Node(1,key,value));
            //哈希表key值指向链表中该位置
            mp[key]=freq_mp[1].begin();
        }
    }
    //调用函数更新频率、val
    void updata(list<Solution::Node>::iterator& iter,int key,int value){
        //找到频率
        int freq=(*iter).freq;
        //原频率哈希表中删除该节点
        freq_mp[freq].erase(iter);
        //哈希表中该频率已无节点,直接删除
        if(freq_mp[freq].empty()){
            freq_mp.erase(freq);
            //若当前频率为最小,最小频率加1
            if(min_freq==freq) min_freq++;
        }
        //插入频率加一的双向链表头,链表中对应:freq key value
        freq_mp[freq+1].push_front(Solution::Node(freq+1,key,value));
        mp[key]=freq_mp[freq+1].begin();
    }
    //get操作函数
    int get(int key){
        int res=-1;
        //查找哈希表
        auto it=mp.find(key);
        if(it != mp.end()){
            auto iter=it->second;
            //根据哈希表直接获取该值
            res=(*iter).val;
            //更新频率
            updata(iter, key, res);
        }
        return res;
    }
};