2013-06-25 1 views
0

다음과 같은 방식으로 지우기를 사용하여지도에서 요소를 제거하지만 제대로 작동하지 않습니다. 왜? 모두 제거하지는 않습니다. std::map::erase()에서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

THER e는 비슷한 질문입니다. http://stackoverflow.com/questions/4636182/problem-with-stdmapiterator-after-calling-erase – doctorlove

답변

6

는 : 삭제 된 요소에

참조 및 반복자가 무효화됩니다. 다른 참조 및 반복기는 영향을받지 않습니다. erase(it)it가 무효화되고,이 후, 정의되지 않은 동작을 일으키는 for 루프에서 사용되는 다음 호출되면

. erase()가 호출되지 않은 경우 반환 (11 C++ 이후) 삭제 된 요소 뒤에 다음 요소로 반복자를 반환 erase()의 가치, 오직 증가를 저장 : C에서

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; 
} 

++ 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; 
} 
관련 문제