vetor在vc6和vs2005下的訪問差異

在更改項目平臺時(vc6.0 -> vs2005)遇到一個錯誤,經過調試發現原因如下。

問題描述:有兩個vector,一個是自定義類型CROI,一個是int型,用for循環將vector<int>中保持的索引去掉vector<CROI>中對應的項,用的是函數erase。

代碼描述:

  1. //optMassIdx是int型的vector,regions是CROI型的vector  
  2. for(i=0;i<optMassIdx.size();i++)  
  3. {   
  4.     regions.erase(regions.begin()+optMassIdx[i]-i,regions.begin()+optMassIdx[i]-i+1);  

錯誤描述:在當regions.begin()+optMassIdx[i]的值大於regions的大小時,vs2005下會報錯,vc6.0不報錯。

原因分析:編譯器先計算regions.begin()+optMassIdx[i],越界後馬上報錯。

修改代碼:

  1. //optMassIdx是int型的vector,regions是CROI型的vector  for(i=0;i<optMassIdx.size();i++)    
  2. {         
  3.       regions.erase(regions.begin()+(optMassIdx[i]-i),regions.begin()+(optMassIdx[i]-i+1));    
  4. }  

總結:

修改後問題解決,只在regions.begin()+optMassIdx[i]計算前,先計算optMassIdx[i]-i,這樣就不會出現越界問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章