2016-06-19 117 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++; 
     } 
    } 
} 

,但我想要的代碼,這樣的工作,因爲這個函數被調用了很多,其中附加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()衝突。無論如何,我可以解決這個問題,仍然可以完成我想要做的事情,而無需重複遍歷矢量?

經過進一步調試,看來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

*「在while循環增加了額外的不必要的時間複雜度額外的」 * - 爲什麼你認爲這是不必要的? –

+0

@Benjamin Lindley好吧,因爲我認爲這是我的代碼超時的部分。這是LeetCode上稱爲LRU Cache的問題,其中存在時間限制,其中我的代碼時間超過。所以我只想找出方法來減少時間複雜性,而不必先改變我的數據結構。我想「不必要的」是一種不好的方式, – 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 

所有三個參數來std::rotate需要爲同一類型(以及來自同一個容器)。所以我不知道你想做什麼,但這個電話顯然無法工作:

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

啊,我明白了。 這是我正在嘗試做的事 'std :: unordered_map :: iterator found = _cache.find(key); used(found,0);' – ygongdev