获取错误:矢量迭代器不兼容

问题描述:

我正在制作一个管理酒店的课程。我能够成功地将客户签入房间。但是,当我尝试从房间签出客户时,我得到一个运行时错误:矢量迭代器不兼容。我运行调试器,并说问题出在我的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

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

首先,你必须从某个地方增加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

你不会在任何地方推进你的迭代器。

你需要在某个时候做++iter或者你的while循环将会是无止境的。

也别忘了.erase使迭代器无效,所以你不能简单地在擦除之后进行。 在匹配id的情况下做iter = roomsCheckedInto.erase(iter);