본문 바로가기

Language/c/c++

map에서 erase시 주의해야 할 사항!!

다음과 같은 코드가 있다고 하자.
루프를 돌면서 값이 value와 같다면 해당 원소를 map에서 지우는 것을 시도하는 코드이다.

typedef std::map<std::string, float> StringFloatMap;

StringFloatMap coll;
StringFloatMap::iterator pos;

for ( pos = coll.begin(); pos != coll.end(); ++pos)
{
     if ( pos->second == value )
     {
            coll.erase(pos);  // 런타임 에러!!
     }
}

coll.erase(pos)이후의 coll의 iterator인 pos가 무효화되므로, 런타임 에러가 발생하게 된다.

해결책은 아래와 같다.
typedef std::map<std::string, float> StringFloatMap;

StringFloatMap coll;
StringFloatMap::iterator pos;

for ( pos = coll.begin(); pos != coll.end(); ++pos)
{
     if ( pos->second == value )
     {
          coll.erase(pos++);
    }
     else
    {
          ++pos;
    }
}


STL과 관련된 참고자료는 아래의 링크를 참고한다.