2016-06-19 10 views
1

私は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; 

私の質問に答えるために役立つコードスニペットを追加できます。

助けていただけたら幸いです!

+0

*「はループが余分に不必要な時間複雑追加しながら、余分な」* - なぜあなたはそれが不要だと思います? –

+0

@Benjamin Lindleyまあ、これは私のコードがタイムアウトする部分だと思うからね。これは、LRUキャッシュと呼ばれるLeetCodeの問題です。ここでは、コード時間が超過する時間制限があります。だから私はデータ構造を最初に変更することなく時間の複雑さを減らす方法を見つけようとしているだけです。私は "不要"はそれを置くために悪い方法だと思います – ygongdev

答えて

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 

ある引数のすべての3つのstd::rotate必要に同じ種類の(同じ容器からのものでもある)ものでなければならない。だから私は、あなたが何をしようとしているのか分からないが、明らかにこの呼び出しが動作しないことができます。

std::rotate(it, it + 1, _lruList.end()); 
+0

ああ、私は参照してください。 ここに私がやろうとしているのは 'std :: unordered_map :: iterator found = _cache.find(key); が使用されました(found、0); ' – ygongdev

関連する問題