详谈C++之迭代器失效

什么是迭代器?

迭代器本质就是STL中遍历容器的一种“工具”,不同的容器的迭代器实现各不相同,但功用都是用于遍历容器中的数据。

简单了解过string,vector与list的底层实现后我们便可以知道,string和vector的迭代器都是属于原生指针,而list的迭代器则是一个封装了结点的结构体

举个简单点的例子吧,vector的迭代器实现大致如下
底层就是一个T*类型(自定义类型)的指针

template <typename T>
    class vector
    {
    public:
        // Vector的迭代器是一个原生指针
        typedef T *iterator;
        typedef const T *const_iterator;

        iterator begin()
        {
            return _start;
        }
        iterator end()
        {
            return _finish;
        }
        const_iterator begin() const
        {
            return _start;
        }
        const_iterator end() const
        {
            return _finish;
        }
    private:
        iterator _start;          // 指向数据块的开始
        iterator _finish;         // 指向有效数据的尾
        iterator _end_of_storage; // 指向存储容量的尾
    };

那么什么是迭代器失效呢?

vector容器的迭代器失效主要分两种

  1. 扩容导致迭代器成为野指针而导致失效
  2. 插入或删除元素后迭代器指向的并非原先指向的元素

list容器的迭代器失效主要即删除结点导致迭代器失效

故此,insert/erase后的迭代器都可能失效
所以原则上,插入和删除数据后不要再去访问原先迭代器

  • 在vs运行环境下,删除元素后不允许再访问该迭代器,因为该迭代器被认为是已失效的迭代器
  • Linux环境下删除元素后可以允许访问该迭代器

解决方式

  • insert函数插入元素后返回指向该元素的迭代器
  • erase函数删除元素后则返回删除元素的下一个元素的迭代器
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c.Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值