vector iterator not incrementable(不明显的错误)

本文通过一个具体的案例探讨了在C++中使用vector时迭代器失效的问题。详细分析了问题出现的原因在于遍历过程中对vector进行了修改,并提出了通过自定义数据结构避免此问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用vector中报出这样的错误,网上查说是迭代器删除的问题,一直没找到原因,后来终于想明白了。做个笔记,希望给遇到同样问题的读者留个参考。

1.出问题代码是这个样子的
for (auto iter = MouseListeners.v.begin(); iter != MouseListeners.v.end();++ iter)
{
            (*iter)->handleMouseCallBack(event->getPosition());
}
2.错略一看没什么问题,其实在回调函数中出了问题,因为只写了一个监听器,所以很明显找到下面代码
Rect r1= Rect(Vec2(490,120),300,100);
         if(r1.containPoint(pos))
         {
             listening=false;
             btn1->setColor(BLACK);
              //EventDispatch::getInstance()->MouseListeners_Clear();
             Director::getInstance()->pushScene(DemoScene1::createScene());

             return;
         }

代码如果看起来似曾相识,那就是对的,笔者最近在参照cocos2d-x写一个游戏引擎。

3.其中Director::getInstance()->pushScene(DemoScene1::createScene())这部分在内部不明显的又一次调用了出问题的部分,继续看
bool DemoScene1::init()
{
    //初始化父级init
    if ( !Layer::init() )
    {
        return false;
    }

    autoCreatpopSprite();
    auto listener=MouseListener::create((MouseCallBack)&DemoScene1::handleMouse1,this);
    EventDispatch::getInstance()->addListener(listener);
    return true;
}
4.在EventDispatch::getInstance()->addListener(listener);这句中其实是又一次调用了最前面用到的vector,向其中添加了数据,因此导致原本的迭代器对象损坏,这下就明了了,其实vector iterator not incrementable所有的原因都是由于各种操作在遍历的同时删除或者添加了数据导致,只是隐藏的太深了而已。
5.笔者的解决办法,就是重新写自己需要的数据结构,底层采用链表或者数组实现,就可以不在使用迭代器,实现一边遍历,同时删除和添加元素了。
注:这次写的一般不易读懂,毕竟自己写的代码,说来轻松,做个笔记,不细说了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值