出现错误:向量迭代器不兼容。

3

我正在为课程制作一个管理酒店的程序。 我可以成功地将客户入住房间。 但是,当我尝试从房间退房客人时,会出现运行时错误:vector iterator incompatible(向量迭代器不兼容)。我运行了调试器,并且显示问题在我的 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);
        }
    }
}

我建议使用Erase-Remove惯用语 - Fred Larson
3个回答

5

erase操作执行后,std::vector迭代器将失效。 (参见此处的参考资料)

尝试将您的代码更改为:

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;
       }
   }
}

谢谢!这解决了问题。我没意识到++iter必须放在else {}里面。很有道理。 - Mike

1

你没有推进迭代器。

你需要在某个时刻执行++iter,否则你的while循环将是无限的。

另外不要忘记.erase会使迭代器失效,所以你不能在删除后简单地推进。 如果匹配id,请执行iter = roomsCheckedInto.erase(iter);


0
首先,您必须在某处递增 iter,否则您永远无法到达 roomsCheckedInto 的末尾 - 这意味着您将陷入无限循环。
其次,erase 会使 iter 失效。
相反,用以下代码替换 while 循环:
while(iter != roomsCheckedInto.end())
{
   if(*iter==rID) iter = roomsCheckedInto.erase(iter);
   ++iter;
}

这是作业吗?如果是,请标记为作业 =)

你的循环有问题。你从第二个开始减少 iter,这会导致错误。 - ipc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接