私はunordered_map
のイテレータを含むベクトルを持っており、イテレータにはstd::rotate
を使用したいと思いますが、何かが欠けているはずです。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++;
}
}
}
のようにいろいろ書いを行う際のコードは動作しますが、この機能がたくさん呼ばれているので、私は、コードは次のように仕事をしたい、その中に余分な
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;
}
}
EDIT:それ以上のコードは、そのタイプと_lruList.end()が競合することがわかります。とにかくこれを修正して、ベクトルを反復せずにやりたいことを達成することができますか?
さらにデバッグした後、it + 1
は私にVS2015に従って"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;
私の質問に答えるために役立つコードスニペットを追加できます。
助けていただけたら幸いです!
*「はループが余分に不必要な時間複雑追加しながら、余分な」* - なぜあなたはそれが不要だと思います? –
@Benjamin Lindleyまあ、これは私のコードがタイムアウトする部分だと思うからね。これは、LRUキャッシュと呼ばれるLeetCodeの問題です。ここでは、コード時間が超過する時間制限があります。だから私はデータ構造を最初に変更することなく時間の複雑さを減らす方法を見つけようとしているだけです。私は "不要"はそれを置くために悪い方法だと思います – ygongdev