STL Container 자료구조에서 순환 삭제를 위한 코드 

컨테이너가 표준 시퀀스 컨테이너이면, 컨테이너 요소를 하나씩 사용하는 루프를 작성합니다.
(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();

vector container를 초기화하려면 다음과 같이 처리한다.
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;
}
2009/11/30 21:52 2009/11/30 21:52

글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

덧글을 달아 주세요

  1. 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에서 반환값을 대입한다.

  2. 로보 2014/08/24 10:40 고유주소 고치기 답하기

    감사합니다. 퍼가도 되겠죠?
    EC++만 봤는데 Effective STL도 필요할 듯해서 방금 중고서적 지르고 왔습니다.