我有一个包含unordered_map
迭代器的向量,我想在迭代器上使用std::rotate
,但我必须遗漏一些东西。
当我像
那样做时,代码可以正常工作std::vector<std::unordered_map<int, int>::iterator> _lruList;
void used(std::unordered_map<int, int>::iterator& it, int type) {
if (type == 0) {
auto item = _lruList.begin();
while (item != _lruList.end()){
if (*item == it){
std::rotate(item, item + 1, _lruList.end());
return;
}
item++;
}
}
}
但我希望代码能够像这样工作,因为这个函数被大量调用,其中额外的while循环增加了额外的不必要的时间复杂度
std::vector<std::unordered_map<int, int>::iterator> _lruList;
void used(std::unordered_map<int, int>::iterator& it, int type) {
if (type == 0) {
std::rotate(it, it + 1, _lruList.end()); //error on it
return;
}
}
编辑:更多代码,我看到它的类型和_lruList.end()冲突。无论如何,我可以解决这个问题,仍然可以完成我想做的事情,而无需迭代向量?
经过进一步调试后,根据VS2015,似乎it + 1
给了我一个"error type"
。
std::unordered_map<int, int>::iterator found = _cache.find(key);
// if key doesn't exist, return -1
if (found == _cache.end()) {
return -1;
}
// if key exists, return value and update lru
used(found, 0);
return found->second;
如果有助于回答我的问题,我可以提供更多代码段。
任何帮助将不胜感激!
答案 0 :(得分:2)
void used(std::unordered_map<int, int>::iterator& it, int type) {
if (type == 0) {
std::rotate(it, it + 1, _lruList.end()); //error on it
return;
}
}
在此功能中,it
(和it + 1
)的类型为
std::unordered_map<int, int>::iterator
但_lruList.end()
属于完全不同的类型
std::vector<std::unordered_map<int, int>::iterator>::iterator
std::rotate
的所有三个参数必须属于同一类型(以及来自同一容器)。所以我不知道你要做什么,但这个电话显然不起作用:
std::rotate(it, it + 1, _lruList.end());