概述
目录
一.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 特点
- list可以在常数时间范围内在任意位置进行插入和删除的序列式容器,因为不需要挪动数据。并且该容器可以前后双向迭代。与其它容器(array,vector,deque)相比,在任意位置插入删除效率更好。
- list与forward_list相似,foword_list是单链表,只能朝前迭代。
- 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迭代器在删除的时候会失效?
为什么插入时不会失效?
注意:迭代器失效不一定会导致程序奔溃,一般时你访问失效的迭代器时描绘导致程序的奔溃。相当于访问了一个野指针。
最后
以上就是高兴哈密瓜为你收集整理的list介绍和list的迭代器失效一.list使用 二.迭代器失效的全部内容,希望文章能够帮你解决list介绍和list的迭代器失效一.list使用 二.迭代器失效所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复