2013-07-21 62 views
1

考慮下面的代碼片段:爲什麼在C++中迭代映射失敗?

map<wstring,int>::iterator it; 
map<wstring,int> bimap; 

//Creating Bigrams out of monograms 
for (it= container.begin(); it != container.end();) 
{ 
    bimap[it->first + L" "+((++it)->first)]++; 
    ++it; 
    ++it; 
} 

如果我運行此代碼的程序崩潰和該崩潰的原因是迭代it的第二個增量。這是爲什麼?迭代器需要增量,我將其遞增兩次而不是一次!它出什麼問題了?

如果我想將兩個相鄰的地圖項值保存到其他地圖中,例如我在上面的語句中實際執行的操作,應該如何處理它?如果我想結合並將每3件其他物品放在一起,該怎麼辦?

我需要分別更新迭代器,但我不知道該怎麼做。

+1

我迷失在你的'++'叢林中......你自己呢? – billz

+0

實際上,第一個++將增加每個值出現次數。這兩個其他++實際上是爲了去下一對值。 (假設它+ 2) – Breeze

回答

2

您可以設置你的循環,當你到達container.end結束,而是因爲你遞增迭代器兩次你到達終點,然後用第二個它++你嘗試去進一步的(錯誤)。

例如:假設您有3個元素。

it = container.begin() 

++it // ok 
++it //ok 

it != container.end() //true 

++it // ok BUT AT THIS MOMENT it = container.end ! 
++it // CRASH 
+0

那麼我應該如何去實現我想要的?我需要得到兩個相鄰的值並將它們保存到另一個地圖中,然後移動到另外兩個地方(3和4並繼續到5和6等!),我不能想出任何其他方法! : -/ – Breeze

+0

但是如果有奇數個值呢? –

+0

我可以解決這個問題,通過獲取地圖長度,我現在不能做的是從任何地方自由地通過地圖迭代!像這樣是線性的\ n很好:( – Breeze

1

你增加你的迭代幾次

for (it= container.begin(); it != container.end();) 
{ 
    bimap[it->first + L" "+((++it)->first)]++; //increment! 
    ++it; //increment! 
    ++it; //increment! 
} 

所以你晚上是在最後一個元素,進入循環,因爲it != container.end()條件得到滿足,然後再出界。

,如果你知道你會做2個增量始終,但最終如果只有一個元素左邊的是,那麼你可能會考慮這個問題:

for (it= container.begin(); it != container.end();) 
{ 
    //do something 
    ++it; //increment! 

    if(it!=container.end()){ //check again. can we move forward? 
    //do something 
    ++it; //increment! 
    } 
} 
1

在每次迭代只遞增一次,並使用輔助反模3(重置各3次迭代之後),做你想要做的每一次任務是0.一樣的東西:

int counter_mod3; 
for (it= container.begin(); it != container.end();) 
{ 
    if(counter_mod3 == 0) // This zero chooses the phase on which the "sampling" is to be made 
    bimap[it->first + L" "+(it->first)]++; //increment! 

    ++it; //increment! 
    counter_mod3 = (counter_mod3++) % 3; 
} 

如果要啓動,而不是第一另一元件上,只需更改相1或2