一.简言
list类似于c语言中的链表。
优势:
1.方便使用
2.功能齐全
二.构造
1.运用
//1
std::list<int> first; // empty list of ints
//2
std::list<int> second (4,100); // four ints with value 100
//3
std::list<int> third (second.begin(),second.end()); // iterating through second
//4
std::list<int> fourth (third); // a copy of third
<type>中代表你选择的类型如上图使用的是int
第一种创建:类似C语言中的内置类型
第二种创建 :创建4个结点,结点类型是int,值为100
第三种创建 : 给定迭代器(类似于指针,C++通过封装实现自定义类型的指向迭代器)区间,创建与迭代器区间值一样的list
第四种创建 :拷贝构造,给定list类型创建的对象,赋予一个新创建的list的对象
2.实现
跟链表一样需要一个Node结点结构体
类里成员创建一个链表(双向链表)的头结点(空)
初始化构造
push_back函数见下文
三.修改
1.运用
(1)push_back()函数
类似链表的尾插
list<int> l1;
l1.push_back(1);
l1.push_back(2);
l1.push_back(3);
(2)insert
指定位置之前插入,返回插入位置迭代器位置。
(3)erase
指定位置删除,返回删除位置之前一个位置的迭代器,来解决迭代器失效问题
(4)pop_back
尾删
(5)pop_front
头删
(6)push_front
头插
四.访问
(1)back
(2)front
五. 迭代器的实现与封装
1.简言
上编文章vector讲到迭代器可以++,但是迭代器的底层原理是指针,指针本身就可以++,而对于链表结构实现向下一个结点的访问需要通过next来实现,所以我们需要将其封装通过重载++来实现其效果。
2.封装
这里为什么我们不使用
ListIterator<T>这种形式呢?
因为在使用const_iterator的时候,如果传const T的话,会导致ListNode种的val类型是const T,从而导致类型不匹配的问题,所以我们可以只改变指针和引用。