获取错误:矢量迭代器不兼容
问题描述:
我正在制作一个管理酒店的课程。我能够成功地将客户签入房间。但是,当我尝试从房间签出客户时,我得到一个运行时错误:矢量迭代器不兼容。我运行调试器,并说问题出在我的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);
}
}
}
答
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;
}
而且,这是家庭作业吗?如果是这样,那么标签=)
答
你不会在任何地方推进你的迭代器。
你需要在某个时候做++iter
或者你的while循环将会是无止境的。
也别忘了.erase
使迭代器无效,所以你不能简单地在擦除之后进行。 在匹配id的情况下做iter = roomsCheckedInto.erase(iter);
。
我推荐[Erase-Remove Idiom](http://en.wikipedia.org/wiki/Erase-remove_idiom)。 – 2012-03-22 21:42:27