본문 바로가기
Programming/C++

[C++] Vector Erase 문제 By 용호

by ★용호★ 2011. 3. 25.

2011년 3월 25일

vector 에서 iterator를 이용하여 for문을 도는 동안 필요 없는 부분을 빼기 위해 vector.erase() 구문을 넣어 주었는데 생각지도 못한 문제가 있었다. 

vector<T>::iterator iter;

 for(iter = temp ; iter < temmax; iter++)
{
        if()
       {
            .......
       }
       else
       {
               tempvector.erase(iter);
       }
}

위와 같은 방식으로 코딩을 했었는데 vector는 erase를 하면 지워진 공간을 뒤에 있는 data들이 앞으로 당겨지며 채워지게 된다.  그렇게 되면 앞으로 당겨진 상태에서 for문의 증감부분에서 iter++을 해줌으로써 값을 하나 건너 뛰게 된다.  
 1,2,3,4,5,6,7,8,9의 숫자가 있을 경우 5번을 erase했다고 했을때 현재 iter의 index는 5를 가리키고 있을 것이고, 5번이 지워지면서 5번이 있던 자리에 6이 오게되고 현재 index 5에 위치한 값은 6이 되는 것이다. 이때 iter++을 하게 되면 숫자 7(index는 6번)을 가리키게 되고 결과적으로 6은 검사 하지 않고 지나치게 되는 것이다.  
 syntax 오류는 나지 않기 때문에 발견하기 어려웠지만 팀장님께서 놓치지 않고 지적해주셨다.  덕분에 엄청난 버그가 생길 뻔 했던 것을 막을 수 있었다.

 아래와 같이 해결한다!

vector<T>::iterator iter;

for(iter = temp ; iter < temmax; )
{
      if()
      {
           tempvector.erase(iter);
      }
      else
      {
           iter++
      }
}


 for문의 증감문에서 iter++을 없앴다.  그리고 erase해주는 부분에서는 증가를 시키지 않고 erase하지 않는 부분에서만 iter++을 하게 하므로써 문제를 해결했다!

댓글