list迭代器失效的问题及解决

        我在上一篇博客讲过vector迭代器失效的原因,迭代器类似于指针,其实所谓的迭代器失效就是指针指向的内容已经失效,所以因为list的空间不连续性,list迭代器失效场景便只有如下情况。

一、迭代器失效的场景

         list迭代器在删除结点时会发生失效,即迭代器指向的结点被删除了,此时迭代器指向了一块被删除的区域,显然这个迭代器已经失去了意义。不过,幸运的是,因为list的空间不连续性,只有被删除结点的迭代器发生了失效,其他的迭代器依旧可以使用。如下:

void TestListIterator()
{
    int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    list<int> l(array, array + sizeof(array) / sizeof(array[0]));
    auto it = l.begin();
    auto test = ++it;
    l.erase(it); //这个时候it已经失效
    *test = 666;//其他迭代器依旧可以使用
    cout << *test << endl;

}

        运行结果:

二、迭代器失效问题的解决

        既然list迭代器失效的原因在于指向的内容已经被删除失效了,那么想要避免这种失效,我们只要将失效的迭代器更新为有效的迭代器即可,如vector迭代器失效的解决方法相似,不过,对于list,有一些特殊的迭代器失效的解决方法技巧,如下:        

// 改正
void TestListIterator()
{
     int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
     list<int> l(array, array+sizeof(array)/sizeof(array[0]));
     auto it = l.begin();
     while (it != l.end())
     {
        l.erase(it++); -------第一种技巧
        // it = l.erase(it);--第二种技巧
     }
}

        如此,list迭代器失效的问题解决,不得不说这个后置++很优雅。 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值