2012-03-22 12 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の終わりに到達することはありません - それはあなたが無限ループになりますです。

第2に、eraseがiterを無効にします。

代わりに、とあなたのwhileループを置き換えます。また

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

、この宿題はありますか?もしそうなら、そのようなタグ=)

+0

ループが間違っています。あなたはエラーを引き起こす2番目から最後までiterを減らします。 – ipc

+0

私はどこでもiterを減らしていません... – aCuria

+1

申し訳ありませんが、逆参照。 – ipc

1

あなたはイテレータをどこにも進めていません。

いつか++iterを実行する必要があります。またはwhileループは無限になります。

また、.eraseはイテレータを無効にするので、消去後に単純に進むことはできません。 IDが一致する場合はiter = roomsCheckedInto.erase(iter);としてください。

関連する問題