本节大纲:
目录
1.list的介绍
(1)列表是序列容器,允许在序列中的任何位置进行固定时间的插入和删除操作,以及在两个方向上进行迭代。
(2)列表容器被实现为双重链接列表;双重链接列表可以将它们所包含的每个元素存储在不同且不相关的存储位置中。排序是通过与每个元素的关联在内部保持的,即指向它前面的元素的链接和指向它后面的元素的链接。
(3)它们与转发列表非常相似:主要的区别是,转发列表对象是单链表,因此它们只能被迭代转发,以换取更小和更高效。
(4)与其他基本标准序列容器(数组,向量和deque)相比,列表通常在容器内的任何位置插入,提取和移动元素时表现得更好,并且因此在密集使用这些的算法中也表现得更好,例如排序算法。
(5)与这些其他序列容器相比,列表和转发列表的主要缺点是它们缺乏通过位置直接访问元素;例如,要访问列表中的第六个元素,必须从已知位置(如开始或结束)迭代到该位置,这需要在这些之间的距离上花费线性时间。它们还消耗一些额外的内存来保持与每个元素相关联的链接信息(这可能是小尺寸元素的大列表的一个重要因素)。
2.list的使用(在list中接口比较多,我们下面主要讲解一下比较常见的中更要接口)
2.1list的构造
(1)空容器构造函数(默认构造函数)
构造一个没有元素的空容器。
(2) FILL 构造函数
构造一个包含 n 个元素的容器。每个元素都是 val 的副本。
(3) 范围构造函数
构造一个容器,其中包含与范围 [first,last] 一样多的元素,每个元素都由该范围内的相应元素构造,顺序相同。
(4) 复制构造函数(我们喜欢成为拷贝构造函数)
构造一个容器,其中包含 x 中每个元素的副本,顺序相同。
为了我们方便理解,可以将此处迭代器理解成一个指针,该指针指向list中的某个节点。
这里需要特别注意的是:(*******)
1. begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动
2. rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动
2.3 list capacity(列表容量)
empty的代码展示使用:
size的使用展示:
2.4 list element access(list元素访问)
大概用法和上面使用方法大致,这里就不过多讲解了。
2.5 list modifiers(列表修饰符)
这上面的待会在代码模拟实现的时候会展示出来哦。
2.6list的迭代器失效问题
迭代器失效即迭代器所指向的节点的无 效,即该节点被删除了。因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入 时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭 代器,其他迭代器不会受到影响。
改正之后:
注意:
easer的返回值:
一个迭代器,指向被函数调用删除的最后一个元素之后的元素。如果操作删除了序列中的最后一个元素,则这是容器结束。
首先呢我们定义三大类:
节点类:
迭代器类:(一个类充当两个类,一个是iterator,const_iterator)
list类:
1.展现迭代器类的代码模拟实现:
(1)首先呢是一个简单的构造函数。
(2)此处的Ref代表了list类上的图片:
下面都是一些简单的迭代器的使用:
2.展现list类的模拟实现:
(1)首先是list的构造函数和赋值:
(2)析构函数(此处的clear:清空list中的有效元素)
(3)list iterator的实现
(4)list capacity(列表容量)的实现
(5)list element access(list元素访问)的实现
(6)list中插入和删除的模拟实现
(7)下图代码的实现都可以套用插入和删除的模拟实现
本节就到此结束啦,如果对你的理解有帮助的话,点赞加收藏,谢谢啦!!!!