2013-06-25 46 views
0

我通過以下方式使用擦除來從地圖中刪除元素,但它無法正常工作。爲什麼?它並沒有消除所有。C++地圖擦除功能無法正確使用迭代器

float nw_cut=80.0; 
for(it=nw_tot1.begin();it!=nw_tot1.end();it++) 
{ 
    float f=(float) ((float) it->second/lines)*100.0; 
    if (f < nw_cut) 
    { 
     nw_tot1.erase(it); 
    } 
} 
+0

療法e是類似的問題,例如http://stackoverflow.com/questions/4636182/problem-with-stdmapiterator-after-calling-erase – doctorlove

回答

6

std::map::erase()

引用和迭代器擦除元件失效。其他引用和迭代器不受影響。

如果erase(it)被稱爲然後it無效,且隨後由for循環導致未定義的行爲中。存儲erase()的返回值,這擦除元素之後返回一個迭代到下一個元素(因爲C++ 11),只有增量如果erase()不叫:

for(it = nw_tot1.begin(); it != nw_tot1.end();) 
{ 
    float f=(float) ((float) it->second/lines)*100.0; 

    if (f < nw_cut) it = nw_tot1.erase(it); 
    else ++it; 
} 

在C++ 03(和C++ 11也),這可能與來完成:

for(it = nw_tot1.begin(); it != nw_tot1.end();) 
{ 
    float f=(float) ((float) it->second/lines)*100.0; 

    if (f < nw_cut) nw_tot1.erase(it++); 
    else ++it; 
} 
1

你應該做這樣的事情:

float nw_cut=80.0; 
for(it=nw_tot1.begin();it!=nw_tot1.end();) 
{ 
    float f=(float) ((float) it->second/lines)*100.0; 
    it_temp = it; //store it in temp variable because reference is invalidated when you use it in erase. 
    ++it; 
    if (f < nw_cut) { 
     nw_tot1.erase(it_temp); 
    } 
} 
0
for(it = nw_tot1.begin(); it != nw_tot1.end();) 
{ 
    float f=(float) ((float) it->second/lines)*100.0; 

    if (f < nw_cut) it = nw_tot1.erase(it); 
    else ++it; 
}