我想用迭代器遍歷C++中的地圖,但不是所有的方式到最後。 問題是,即使我們可以用迭代器進行基本操作,我們也無法添加或比較迭代器和整數。 如何編寫以下說明? (final
是地圖; window
,整數)如何在迭代器不是隨機訪問時停止在地圖結束之前迭代「n」?
for (it=final.begin(); it!=final.end()-window; it++)
我想用迭代器遍歷C++中的地圖,但不是所有的方式到最後。 問題是,即使我們可以用迭代器進行基本操作,我們也無法添加或比較迭代器和整數。 如何編寫以下說明? (final
是地圖; window
,整數)如何在迭代器不是隨機訪問時停止在地圖結束之前迭代「n」?
for (it=final.begin(); it!=final.end()-window; it++)
std::map<T1, T2>::iterator it = final.begin();
for (int i = 0; i < final.size()-window; ++i, ++it)
{
// TODO: add your normal loop body
}
替換T1
和T2
與實際類型的地圖的鍵和值的。
我會讓循環的增量指令爲'++我,++它',所以他們都一直髮生。在當前的代碼中,一個'continue'語句會破壞一切。 – 2011-02-27 09:07:26
是的。我試圖在循環結束時保持簡單,但「繼續」是一個不放在那裏的好理由。 – Oswald 2011-02-27 09:13:13
@ 6502:不,如果你有'window
爲什麼不讓它成爲迭代器呢?
很明顯,它已經是一個迭代器了。 – 2011-02-27 09:08:10
你不能從地圖迭代器直接相減,因爲它是一個昂貴的操作(在實踐中做--iter所需的次數)。如果你真的想要這樣做,你可以使用標準庫函數'advance'。
map<...>::iterator end = final.end();
std::advance(end, -window);
這會給你你的窗戶的結束。
很明顯,你需要在進入循環之前計算一次*。沒有意義在每次迭代計算它:) – 2011-02-27 09:41:13
另一種解決方案:
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
元素,即使你改變地圖的大小,你的循環內(如增加新的元素)size()
可以採取O(n)的時間來計算,但通常的實現可以在O(1)中做到這一點。爲了安全起見,如果沒有必要,最好不要多次調用size()。++it
可以比it++
更快。增量後運算符創建一個臨時對象,而另一個 - 不。當變量是一個簡單的整型時,編譯器可以對其進行優化,但對於迭代器來說並非總是如此。
請注意,您可以[通過將行格式化爲代碼](http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks)縮進四個空格。編輯器工具欄中的「{}」按鈕可以爲您做到這一點。編輯你的問題並嘗試一下。單擊編輯器工具欄中的橙色問號以獲取更多信息和格式化提示。 – outis 2011-02-27 09:01:10
@user:您應該避免在'for'循環的條件部分中調用函數,因爲它將在每一輪執行。這是過早pessimization :) –
2011-02-27 09:42:33