C++ STL의 Map, Set 의 인자 삭제 관련하여,
보통 STL의 순환 중에는 인자를 삭제하지 않는다.
이터레이터 무효화 때문인데, 위 순차 컨테이너에 대하여 반복문 내에서 삭제할 수 있도록 코드를 구성 해봤다.
std::map<int, int> mapRemoveTest;
for( int i = 80; i < 100; ++i ) { mapRemoveTest.emplace( i, i ); }
for( int i = 10; i < 30; ++i ) { mapRemoveTest.emplace( i, i ); }
for( int i = 0; i < 10; ++i ) { mapRemoveTest.emplace( i, i ); }
for( int i = 30; i < 50; ++i ) { mapRemoveTest.emplace( i, i ); }
for( int i = 70; i < 80; ++i ) { mapRemoveTest.emplace( i, i ); }
for( int i = 50; i < 70; ++i ) { mapRemoveTest.emplace( i, i ); }
for( auto i = mapRemoveTest.begin(), nexti = std::next( mapRemoveTest.begin(), !mapRemoveTest.empty() );
mapRemoveTest.end() != i;
i = ( mapRemoveTest.end() != nexti ) ? nexti++ : nexti )
{
mapRemoveTest.erase( i );
}
위 mapRemoveTest 컨테이너에는 0~99 까지 100개의 int가 삽입 되어 있다.
아래 for문에서는 i인덱스(현재 offset)를 통해 인자를 삭제하며,
nexti인덱스(다음 offset)을 통해 이터레이터의 무효화를 막아주고 있다.
가독성이 안좋은 코드이기 때문에 현업에서는 무리지만,
개인 프로젝트나 메모리를 극한으로 아껴야 하는 상황에는 활용해도 좋을 것 같다.
잊지 않기 위해 기억해둔다.