상세 컨텐츠

본문 제목

STL list의 erase함수에러

Maya API/C++

by hwano 2014. 4. 17. 14:04

본문

///////////////////////////////////////////////////////////////////////////////////////////////

참고사이트

http://search.naver.com/search.naver?where=nexearch&sm=ies_hty&query=iterator+erase+%EB%AC%B4%ED%9A%A8&ie=utf8

 

http://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&ie=utf8&query=Iterator%EC%97%90+%EB%8C%80%ED%95%9C+%EA%B0%84%EB%9E%B5%ED%95%9C+%EC%86%8C%EA%B0%9C%EC%99%80+list.Erase+%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD%21&x=13&y=24                       <--제일 위 링크

///////////////////////////////////////////////////////////////////////////////////////////////

 

 

 

hFomula 노드를 작성하다가 erase작업에서 에러가 났다.

 

수식을 연산자와 숫자를 나눠서 순서대로 list에 집어 넣고

반복자로 서치를 하다가 만약 연산자면 앞뒤숫자들을 가져와

연산자에 맞는 연산을 하고 계산이 끝난 노드들은 지우려고 하였다.

 

그런데 삭제시 에러가 났다.

 

아래는 간단히 에러나는 부분만 표현

 

list<string>::iterator iter;

for( iter=expression.begin(); iter!=expression.end(); iter++ )

{
          if( *iter == "+" )     // 더하기 연산자면
          {
               expression.erase( iter );   // 지운다.
          }
 } 

 

 

다음과 같이 iterator로 순차적으로 접근하다가 특정 값이 되었을 경우 해당 노드를 삭제한다고 할 때

에러가 나면서 마야가 다운된다.

 

위와 같이 노드를 삭제해 버리면 iterator는 무효한 포인터가 되어버리기 때문에 에러가 나는것이다.

( 아랫줄을 계속 읽다보면 무슨말인지 이해된다 )

 

이 문제는 erase연산의 리턴 값을 다시 iter에 저장하여 해결할 수 있다.

 

iter = expression.erase( iter );

 

이 코드를 설명하자면

먼저 erase 함수에 iter값을 넘김으로서 해당 노드는 삭제되고 iter변수는 무효한 포인터가

되어버렸다. 하지만 erase함수는 자신이 삭제한 노드의 그 다음 노드를 가리키는 iter를 반환하기 때문에

위와같은 코드를 사용할 시에는 문제없이 코드가 진행된다.

 

정리해보자면 위 코드의 경우 이게 더 깔끔하다.

 

list<string>::iterator iter;

iter=expression.begin();

while( iter!=expression.end(); )

{

if( *iter == "+" )

{

iter = expression.erase( iter );  

}

else

{

iter++;

}

}

 

 

 

관련글 더보기