컨테이너가 표준 시퀀스 컨테이너이면, 컨테이너 요소를 하나씩 사용하는 루프를 작성합니다.
(erase를 호출할 때마다 그 함수의 반환값으로 반복자를 업데이트 하는 일을 꼭 해야 합니다.)
컨테이너가 표준 연관 컨테이너이면, 컨테이너 요소를 하나씩 사용하는 루프를 작성합니다.
(erase를 호출하면서 erase에 넘기는 반복자를 후위 증가 연산자로 증가시킵니다.)
(출처 : Effective STL p88)
주의사항 : erase에 continue가 붙어서 작성되는 점이 중요하다.
이유 : erase가 ++it 역할을 하기 때문에 ++it 없이 continue를 하면 무한루프가 발생하기 때문이다.
팁 : erase() 함수의 리턴값이 있으면 반환값을 받고, 없으면 후위 증가 연산자로 증가시킵니다.
// std::vector 순환 삭제 코드 typedef std::vector< int > VEC_Container; VEC_Container vecContainer; vecContainer.push_back( 1 ); vecContainer.push_back( 2 ); vecContainer.push_back( 3 ); vecContainer.push_back( 4 ); vecContainer.push_back( 5 ); VEC_Container::iterator it = vecContainer.begin(); for( ; it != vecContainer.end(); ) { // erase 코드 if( TRUE /*FALSE*/ ) { it = vecContainer.erase( it ); continue; } ++it; }vector container 크기(capacity)를 줄이려면 다음과 같이 처리한다.
VS2008 이하
VEC_Container(vecContainer).swap(vecContainer);
VS2010 이상
vecContainer.shrink_to_fit();
VEC_Container(vecContainer).swap(vecContainer);
VS2010 이상
vecContainer.shrink_to_fit();
VEC_Container().swap(vecContainer);
// std::list 순환 삭제 코드 typedef std::list< int > LIST_Container; LIST_Container listContainer; listContainer.push_back( 1 ); listContainer.push_back( 2 ); listContainer.push_back( 3 ); listContainer.push_back( 4 ); listContainer.push_back( 5 ); LIST_Container::iterator it = listContainer.begin(); for( ; it != listContainer.end(); ) { // erase 코드 if( TRUE /*FALSE*/ ) { it = listContainer.erase( it ); continue; } ++it; }
// std::map 순환 삭제 코드 typedef std::map< int, int > MAP_Container; MAP_Container mapContainer; mapContainer.insert( std::make_pair(1, 5) ); mapContainer.insert( std::make_pair(2, 4) ); mapContainer.insert( std::make_pair(3, 3) ); mapContainer.insert( std::make_pair(4, 2) ); mapContainer.insert( std::make_pair(5, 1) ); MAP_Container::iterator it = mapContainer.begin(); for( ; it != mapContainer.end(); ) { // erase 코드 if( TRUE /*FALSE*/ ) { mapContainer.erase( it++ ); continue; } ++it; }
덧글을 달아 주세요
AtoJang 2012/04/25 19:07 고유주소 고치기 답하기
if()
{}
else
{} 로 처리하면 안되나요 굳이 Continue 를 써야하나요?
TTF 2013/12/03 10:59 고유주소 고치기
if() else 로 처리하시는 것도 추천드립니다.
continue를 꼭 써야 하는 이유는 없습니다.
단순히 동일한 패턴으로 만들기 위해서 사용하였습니다.
1. iterator 증가 이후에는 다음 반복 구문으로 넘어간다.
2-1. 연관 컨테이너는 erase에서 it++이 필요하다.
2-2. 시퀀스 컨테이너는 erase에서 반환값을 대입한다.
로보 2014/08/24 10:40 고유주소 고치기 답하기
감사합니다. 퍼가도 되겠죠?
EC++만 봤는데 Effective STL도 필요할 듯해서 방금 중고서적 지르고 왔습니다.
TTF 2014/08/28 11:29 고유주소 고치기
네 퍼가셔도 됩니다. ^^
토리 2017/05/13 22:46 고유주소 고치기 답하기
정말 많은 도움이 되었습니다. 감사합니다