list介绍和list的迭代器失效

目录

一.list使用

 1.1 list介绍

 1.2 特点

 1.3 list的使用

1.list构造

 2.list iterator迭代器的使用

 3.list capacity

4.list element access

5.list madifiers修改链表函数

 二.迭代器失效


一.list使用

        1.1 list介绍

        list底层是一个双向链表结构,每一个结点由三个成员变量组成。一个成员变量保存元素值,一个成员变量为一个指针保存上一个结点的地址,一个成员变量也是指针保存下一个结点的地址。

        1.2 特点

  1. list可以在常数时间范围内在任意位置进行插入和删除的序列式容器,因为不需要挪动数据。并且该容器可以前后双向迭代。与其它容器(array,vector,deque)相比,在任意位置插入删除效率更好。
  2. list与forward_list相似,foword_list是单链表,只能朝前迭代。
  3. list和forward_list的最大缺陷是不能随机访问,只能通过已知的位置迭代到访问位置。

 1.3 list的使用

使用list需要包含头文件:#include<list>

1.list构造

list():构造空的list

list(size_type n,const value_type& val=value_type()):构造list中包含n个值为val的元素。

list(const list& x):拷贝构造函数

list(inputiterator first,inputtlterator last):用[first,last)区间中的元素构造list,区间是迭代器区间。

 2.list iterator迭代器的使用

begin():返回第一个元素的迭代器

end():返回最后一个元素下一个位置的迭代器

rbegin():返回第一个元素的reverse_iterator即end()位置,

rend():返回最后一个元素的下一个位置的revers_iterator即begin位置。

 注意:

1.在遍历情况下,只来可以用迭代器遍历就可以用C++11的范围for遍历,范围for最终转化为迭代器。

2.begin与end为正向迭代器,对正向迭代器执行++操作,迭代器向后移动

3.rbegin与rend为反向迭代器,对反向迭代器执行++操作,迭代器向前移动

 3.list capacity

empty:判断list是否为空,是返回true,否则返回false

size:返回有效结点个数

list没有capacity函数。

4.list element access

front:返回list的第一个结点中值的引用

back:返回list最后一个值的引用。

5.list madifiers修改链表函数

push_front:在list首元素前插入值为val的元素

pop_front:删除list第一个元素,不是头节点

push_back:在list尾部插入值为val的元素

pop_back:删除list最后一个元素

insert:在list pos位置插入值为val的元素

erase:删除list pos位置元素

swap:交换两list中的元素。元素是结点指针,即交换两指针变量保存的地址。

clear:清空list的元素,留下头节点。

注意:vector和list的insert和erase的第一个元素类型是迭代器,返回值也是迭代器

        insert返回插入位置,erase返回原删除位置的下一个位置。为了还保持在pos位置

        插入在pos前插入,删除在pos位置删除

 二.迭代器失效

       首先,我们可以将迭代器想象成类似指针一样,实际它是一个类,成员变量的结点指针,成员函数使得它的操作像指针一样。

        list迭代器失效即迭代器所指向的那个结点失效了,即该结点被删除了。因为list的底层结构为带头双向循环链表,并不是一个连续的结构。插入并不会导致迭代器的失效,不会扩容开辟新空间。只有在删除的时候才会失效,并且失效的只是指向被删除结点的迭代器,其它的迭代器并不会收到影响。

        对比vector迭代器,vector底层结构是一个数组,是一段连续的空间。当进行插入需要扩容时,会进行深拷贝,扩容开辟新空间,而迭代器还指向旧空间,就导致迭代器失效了。

为什么list迭代器在删除的时候会失效?

 为什么插入时不会失效?

 注意:迭代器失效不一定会导致程序奔溃,一般时你访问失效的迭代器时描绘导致程序的奔溃。相当于访问了一个野指针。

 

        

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值