다음과 같은 코드가 있다고 하자.
루프를 돌면서 값이 value와 같다면 해당 원소를 map에서 지우는 것을 시도하는 코드이다.
루프를 돌면서 값이 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); // 런타임 에러!!
}
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;
}
}
StringFloatMap coll;
StringFloatMap::iterator pos;
for ( pos = coll.begin(); pos != coll.end(); ++pos)
{
if ( pos->second == value )
{
coll.erase(pos++);
}
else
{
++pos;
}
}