std :: rotate参数不正确?

时间:2016-06-19 04:20:29

标签: c++ vector rotation iterator unordered-map

我有一个包含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;

如果有助于回答我的问题,我可以提供更多代码段。

任何帮助将不胜感激!

1 个答案:

答案 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());