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

时间:2012-03-22 21:10:06

标签: c++

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

3 个答案:

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

另外,这是家庭作业吗?如果是这样,标记为=)