2012-04-05 3 views
9

반복자가 가리키는 요소를 지우고 다음 요소로 가기 위해 동일한 반복자를 한 줄로 진행할 수 있습니까?C++ 반복자 제거 설정

set<int>::iterator it = S.begin(); 
while (it != S.end()) { 
    if (shouldBeRemoved(*it)) { 
     S.erase(it++); // is this line valid? 
    } else { 
     ++it; 
    } 
} 

답변

5

는 다음 요소로 이동합니다 반복자가 가리키는 요소를 삭제하고, 한 줄에 같은 반복자를 발전 할 수 있습니까?

예. 유효합니다.


근거 :

it++it 단위는 다음의 요소를 지칭하지만 원래 값의 사본을 얻을 수 있도록. 따라서 iterase()이 호출 될 때 제거되는 요소를 참조하지 않습니다. std::set의 경우 지운 요소에 대한 반복기 만 무효화됩니다. # 1

이 코드 예제는 반복기가 참조하는 요소를 제거하는 상용구 코드로 간주 할 수 있습니다.


참고 : std::set를 들어

,
# 1C++ 03 표준 23.1.2/8 :

지워진 만 반복자 및 참조 요소가 무효화되었습니다.

2

예, 유효합니다. 식 은 함수가 호출되기 전에 완전히 평가되므로이 함수는 이전 값인 it을 받지만 제거 (및 무효화)되는 시간까지 이미 반복기가 증가합니다.