2012-03-22 74 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

我推薦[Erase-Remove Idiom](http://en.wikipedia.org/wiki/Erase-remove_idiom)。 – 2012-03-22 21:42:27

回答

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

謝謝!這解決了它。我沒有意識到++必須在else {}中去。說得通。 – Mike 2012-03-22 21:35:49

0

首先,你必須從某個地方增加ITER,否則你將永遠不會達到roomsCheckedInto結束 - 這是你將有一個無限循環。

其次,擦除使其無效。

相反,替換while循環:

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

而且,這是家庭作業嗎?如果是這樣,那麼標籤=)

+0

你的循環是錯誤的。你從第二個減少到最後會導致錯誤。 – ipc 2012-03-22 21:28:56

+0

我不會在任何地方遞減... – aCuria 2012-03-22 21:34:42

+1

對不起,取消引用。 – ipc 2012-03-22 21:45:06

1

你不會在任何地方推進你的迭代器。

你需要在某個時候做++iter或者你的while循環將會是無止境的。

也別忘了.erase使迭代器無效,所以你不能簡單地在擦除之後進行。 在匹配id的情況下做iter = roomsCheckedInto.erase(iter);