为了方便插入和删除操作,选用双向链表list作为缓存的数据结构,因为要存的是一个int型键值对,所以用list<list<int>>结构。list在做插入以及将结点移至头部的操作时都十分方便,美中不足的是在查找时需要遍历链表。
从提交结果来看运行速度有点出乎我的预料。
代码仍有较大改进空间,欢迎大家指正。</int>

vector<int> LRU(vector<vector<int> >& operators, int k) {
        // write code here
        vector<int> result;//存储输出结果
        list<list<int>> arr;//缓存数据结构
        for(vector<vector<int>>::const_iterator iter = operators.cbegin();iter != operators.cend();iter++){
            if(iter->at(0) == 1){
                int x = iter->at(1);
                int y = iter->at(2);
                if(arr.size() == k ){//若缓存已满,从链表尾部删除结点
                    arr.pop_back();
                }
                list<int> item;
                item.push_front(y);
                item.push_front(x);
                arr.push_front(item);//将结点插入表头
            }else{
                int x = iter->at(1);
                list<list<int>>::iterator it = arr.begin();
                int flag = 0;//标示是否找到目标结点
                int control = 0;//控制遍历,如果不使用该变量会发生iterator越界
                while(it != arr.end()){//遍历查找结点
                    if(it->front() == x){
                        result.push_back(it->back());
                        arr.push_front(*it);//将目标结点插入队头
                        arr.erase(it);//从队中删除目标结点
                        flag = 1;
                        break;
                    }
                    control++;
                    if(control >= arr.size()){
                        break;
                    }
                    it++;
                }
                if(flag == 0){
                    result.push_back(-1);
                }

            }
        }
        return result;
    }
};