2012-03-22 3 views
3

호텔을 관리하는 클래스 용 프로그램을 만들고 있습니다. 고객을 성공적으로 체크인 할 수 있습니다. 그러나 방에서 고객을 체크 아웃하려고하면 런타임 오류가 발생합니다. 벡터 반복기가 호환되지 않습니다. 디버거를 실행하고 문제가 내 while 루프의 조건문에 있다고 말했지만 문제가 무엇인지 파악할 수 없습니다 (디버거를 올바르게 사용했다고 생각합니다). 이 비슷한 오류가있는 다른 게시물을 보았지만 솔루션을 찾을 수 없었습니다. 누구든지 도와 줄 수 있습니까? erase 동작이 수행 된 후에오류 받기 : 벡터 반복기가 호환되지 않음

void Customer::removeRoomID(int rID) 
{ 
    vector<int>::iterator iter; 
    iter = roomsCheckedInto.begin(); 
    while(iter != roomsCheckedInto.end()) // <--DEBUGGER SAYS ERROR IN THIS LINE - ERROR: VECTOR ITERATOR INCOMPATIBLE 
    { 
     if(*iter==rID) 
     { 
      roomsCheckedInto.erase(iter); 
     } 
    } 
} 
+0

[지우기 삭제 관념] (http://en.wikipedia.org/wiki/Erase-remove_idiom)을 권하고 싶습니다. –

답변

5

std::vector 반복자 무효화된다.

(See reference here)은 당신의 코드를 변경해보십시오 :

void Customer::removeRoomID(int rID) 
{ 
    vector<int>::iterator iter; 
    iter = roomsCheckedInto.begin(); 
    while(iter != roomsCheckedInto.end()) 
    { 
     if(*iter==rID) 
     { 
      // iter should now be set to the value 
      // returned from the erase() method. 
      iter = roomsCheckedInto.erase(iter); 
     } 
     else 
     { 
      ++iter; 
     } 
    } 
} 
+0

감사합니다! 이것으로 해결했습니다. 나는 iter가 {else}에 들어가야한다는 것을 깨닫지 못했습니다. 말이된다. – Mike

0

은 첫째, 당신이 어딘가에 ITER를 증가해야하거나 roomsCheckedInto의 끝에 도달하지 않습니다 - 그건 당신이 무한 루프 것입니다.

둘째, erase가 iter를 무효화합니다.

대신하여 while 루프 교체 : 또한

while(iter != roomsCheckedInto.end()) 
{ 
    if(*iter==rID) iter = roomsCheckedInto.erase(iter); 
    ++iter; 
} 

을,이 숙제는? 그렇다면 태그 =)

+0

루프가 잘못되었습니다. 당신은 오류를 일으킬 것입니다 두 번째에서 끝까지 반복 iter. – ipc

+0

나는 어디서나 iter 감소하지 않습니다 ... – aCuria

+1

죄송합니다, 참조. – ipc

1

어디에서나 반복자를 진행하지는 않습니다.

어느 시점에서 ++iter을 수행해야합니다. 그렇지 않으면 while 루프가 끝이 없습니다.

또한 .erase은 이터레이터를 무효화하므로 지우기 후에 단순히 진행할 수 없습니다. 일치하는 ID 인 경우 iter = roomsCheckedInto.erase(iter);을 입력하십시오.