[英]the sequence of insert and erase using stl::list
当我在leetcode上练习时,遇到了这样的问题:
我使用了stl::list
容器作为LRU算法的缓存。 但是擦除项目和插入项目的顺序使结果有所不同。
我知道这实际上是stl::list
的双重stl::list
。 当我使用迭代器时,插入和擦除的顺序应该无关紧要。
代码在这里
class LRUCache{
public:
map<int, list<pair<int,int>>::iterator> mKey;
list<pair<int,int>> lCache;
int cap;
LRUCache(int capacity) {
cap = capacity;
}
int get(int key) {
auto iter = mKey.find(key);
if(iter != mKey.end()) {
int value = (iter->second)->second;
//**the sequence of next two lines can not be changed!***
lCache.erase(iter->second);
mKey[key] = lCache.insert(lCache.begin(), make_pair(key,value));
return value;
}
return -1;
}
void set(int key, int value) {
auto iter = mKey.find(key);
if(iter == mKey.end()) {
if(lCache.size() < cap) {
mKey[key] = lCache.insert(lCache.begin(), make_pair(key,value));
}
else{
mKey[key] = lCache.insert(lCache.begin(), make_pair(key,value));
mKey.erase(lCache.back().first);
lCache.pop_back();
}
}
else {
lCache.erase(iter->second);
mKey[key] = lCache.insert(lCache.begin(), make_pair(key,value));
}
}
};
您要问的还不太清楚。 如果您的问题是为什么不能重新排列这两行:
//**the sequence of next two lines can not be changed!***
lCache.erase(iter->second);
mKey[key] = lCache.insert(lCache.begin(), make_pair(key,value));
那很简单。 iter
指向与mKey[key]
相同的节点,因此分配实际上更改了mKey[key]
iter->second
的值。 如果分配首先发生,则iter->second
将指向新插入的列表节点,而不是先前存在的列表节点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.