1.双向链表与单向链表
1)单向链表:forward_list,也叫向前链表,操作都在链表头,操作比双向链表更快
2)双向链表:list,比单向链表多了个指向前方的指针
2.与vector的区别
vector的特点:
1)随机访问快,即下标运算
2)尾部添加,不申请空间的情况下,非常快
3)不支持快速插入和删除,比较慢
list的特点:
1)随机访问慢,不支持下标运算
2)支持快速插入和删除
3.头文件
#include <list>
4.定义
1)定义list对象
list<类型> lis;
类型可以是基本数据类型也可以是结构体和对象等等
list<int> lis;
2)定义迭代器
list<int>::iterator ite;
5.构造函数
1)无参数的构造,构造一个空的list
list<int> lis1;
2)输入一个参数,指定链表的大小或者说是元素个数,元素初始化为0
list<int> lis2(5);
3)输入两个参数,第一个参数指定元素的个数,第二个参数指定每个参数的值
list<int> lis3(5, 8);
4)调用拷贝构造,用一个已存在的list链表初始化新链表
list<int> lis4(lis3);
5)通过迭代器初始化新链表
list<int> lis5(lis3.begin(), lis3.end());
注意:list中不支持迭代器进行加法运算,比如:lis3.begin()+2是非法的,迭代器可能进行++和--运算
具体实例:
list<int> lis1;
for_each(lis1.begin(), lis1.end(), Out);
cout << "\n";
list<int> lis2(5);
for_each(lis2.begin(), lis2.end(), Out);
cout << "\n";
list<int> lis3(5, 8);
for_each(lis3.begin(), lis3.end(), Out);
cout << "\n";
list<int> lis4(lis3);
for_each(lis4.begin(), lis4.end(), Out);
cout << "\n";
list<int> lis5(lis3.begin(), lis3.end());
for_each(lis5.begin(), lis5.end(), Out);
cout << "\n";
执行结果:
6.属性
1)没有容量的定义了
2)empty(); //检测链表是否为空
3)size(); //链表的大小
4)resize(); //设置链表的大小
链表增大填充的值为0,减小就截断链表的值
list<int> lis1;
for_each(lis1.begin(), lis1.end(), Out);
cout << "\n";
cout << "empty: " << lis1.empty() << endl;
cout << "size: " << lis1.size() << endl;
lis1.resize(5);
for_each(lis1.begin(), lis1.end(), Out);
cout << "\n";
cout << "empty: " << lis1.empty() << endl;
cout << "size: " << lis1.size() << endl;
lis1.resize(2);
for_each(lis1.begin(), lis1.end(), Out);
cout << "\n";
cout << "empty: " << lis1.empty() << endl;
cout << "size: " << lis1.size() << endl;
执行结果: