2011-02-27 42 views
3

我想用迭代器遍歷C++中的地圖,但不是所有的方式到最後。 問題是,即使我們可以用迭代器進行基本操作,我們也無法添加或比較迭代器和整數。 如何編寫以下說明? (final是地圖; window,整數)如何在迭代器不是隨機訪問時停止在地圖結束之前迭代「n」?

for (it=final.begin(); it!=final.end()-window; it++) 
+0

請注意,您可以[通過將行格式化爲代碼](http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks)縮進四個空格。編輯器工具欄中的「{}」按鈕可以爲您做到這一點。編輯你的問題並嘗試一下。單擊編輯器工具欄中的橙色問號以獲取更多信息和格式化提示。 – outis 2011-02-27 09:01:10

+0

@user :您應該避免在'for'循環的條件部分中調用函數,因爲它將在每一輪執行。這是過早pessimization :) – 2011-02-27 09:42:33

回答

3
std::map<T1, T2>::iterator it = final.begin(); 
for (int i = 0; i < final.size()-window; ++i, ++it) 
{ 
    // TODO: add your normal loop body 
} 

替換T1T2與實際類型的地圖的鍵和值的。

+0

我會讓循環的增量指令爲'++我,++它',所以他們都一直髮生。在當前的代碼中,一個'continue'語句會破壞一切。 – 2011-02-27 09:07:26

+0

是的。我試圖在循環結束時保持簡單,但「繼續」是一個不放在那裏的好理由。 – Oswald 2011-02-27 09:13:13

+0

@ 6502:不,如果你有'window 2011-02-27 13:04:58

5

你不能從地圖迭代器直接相減,因爲它是一個昂貴的操作(在實踐中做--iter所需的次數)。如果你真的想要這樣做,你可以使用標準庫函數'advance'。

map<...>::iterator end = final.end(); 
std::advance(end, -window); 

這會給你你的窗戶的結束。

+2

很明顯,你需要在進入循環之前計算一次*。沒有意義在每次迭代計算它:) – 2011-02-27 09:41:13

0

另一種解決方案:

size_t count=final.size(); 
size_t processCount=(window<count?count-window:0); 
for (it=final.begin(); processCount && it!=final.end(); ++it, --processCount) 
{ 
    // loop body 
} 

這一個是比較安全:

  • 它採用了這樣的情況,當你的地圖實際上比的window的值。
  • 將處理最多processCount元素,即使你改變地圖的大小,你的循環內(如增加新的元素)
  • 根據STL,size()可以採取O(n)的時間來計算,但通常的實現可以在O(1)中做到這一點。爲了安全起見,如果沒有必要,最好不要多次調用size()。
  • 「端()」,另一方面已分期常量時間,所以它應該是行有它在for循環條件
  • ++it可以比it++更快。增量後運算符創建一個臨時對象,而另一個 - 不。當變量是一個簡單的整型時,編譯器可以對其進行優化,但對於迭代器來說並非總是如此。
相關問題