我正在为管理酒店的班级制作一个程序。我能够成功地将客户登记入房间。但是当我试图从一个房间检出一个客户时,我得到一个运行时错误:矢量迭代器不兼容。我运行调试器,并说问题是在我的while循环的条件语句中,但我无法弄清楚问题是什么(我认为我正确使用了调试器)。我尝试用其他类似错误查看其他帖子,但我无法找到解决方案。有人可以帮忙吗?
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 :(得分:5)
std::vector
操作后, erase
迭代器无效。 (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;
}
}
}
答案 1 :(得分:1)
你没有在任何地方推进你的迭代器。
您需要在某个时刻执行++iter
,否则您的while循环将无穷无尽。
另外不要忘记.erase
使迭代器无效,因此擦除后不能简单地前进。
如果匹配id,请iter = roomsCheckedInto.erase(iter);
。
答案 2 :(得分:0)
首先,你必须在某个地方增加它,否则你永远不会到达roomsCheckedInto的末尾 - 那就是你将有一个无限循环。
其次,擦除会使其失效。
相反,用:
替换你的while循环while(iter != roomsCheckedInto.end())
{
if(*iter==rID) iter = roomsCheckedInto.erase(iter);
++iter;
}
另外,这是家庭作业吗?如果是这样,标记为=)