基本概念
list也叫链表,是连式存储,和之前的容器比空间上非连续
1如上,和数组连续空间不一样,列表存储空间额外预留了存储下一个元素的地址指针,尾部的下个节点为空所以用NULL。链表的特点是插入删除快,直接将新节点的地址和插入前的地址进行修改即可,而遍历则不如数组,链表的内容分为数据域和指针域
2如上,除了单向链表,还有双向链表,存储的指针域多了前一个节点的地址。这样知道了一个节点不会只知道下一个节点位置,也能知道前一个节点的位置,当然可以看到头插头删和尾插尾删,以及insert指定位置删除,front,back获得首尾的数据,begin,end用于迭代器遍历
优点,采用动态分配内存,不会浪费内存,同时因为vector插入删除可能要复制自身,首尾地址会变化,而链表除了操作首尾元素,否则不会改变
构造方法
3如上,可以看到构造方法也是无参,起止,N重复,拷贝构造,没啥可说的
4如上,把所有构造方法都演示了一圈,注意,list的区间构造不支持+-操作,因为空间不是连续的
赋值和交换
5如上,就是按起止位置或n重复元素assign成员方法,=重载,以及swap实现2个链表的交换
6如上
大小操作
7如上,我们还是经典的几个方法,和vector一样,可以empty判断是否为空,size返回个数,resize调整大小,可以使用默认参数补齐或者指定默认参数补齐,链表不用容量因为动态分配内存,
8没什么说的,就是调用方法
插入删除
9 10如上,我们仅验证remove,这个是删除所有值一样的元素,而不是像python一样只删除一个
数据存取
11没啥说的,就是返回首尾元素,我们list是不支持索引的,不能使用[],at方法,所以必须从首尾元素遍历过去,不支持随机访问
12如上,我们可以看到访问首尾元素,由于不支持随机访问,所以迭代器指针只支持++,--这样的操作,而不支持+=1,+=3这样的,而且能--,所以默认是双向链表
反转和排序
13反转和排序就是如上2个方法,reverse和sort
14如上,没什么说的
15当然sort方法还可以使用重载,默认升序,我们可以传入一个自定义的方法来比较,我们将方法传入2个参数,返回前者大于后者(bool值)即实现降序排列,如上。目前还没有讲仿函数,后面讲了也可以传入。我们记得还有deque也可以排序,但并不是成员方法,而是调用了algorithm模块的sort方法
16我们可以来使用判断复合参数排序,类似元组,比如按照姓名降序,如果姓名相同,按照年龄升序,如上就是个小案例
网友评论