list
双向链表
- 比单向链表多了个指向前方向的指针
- 与vector的区别:
vector
: 是一个数组
(1)支持快速随机访问,即下标运算
(2)尾添加,不申请空间的情况下非常快
(3)插入和删除比较慢
list
: 是一个链表
(1)随机访问慢,也支持下标
(2)支持快速插入和删除
头文件
#include <list>
using namespace std;
定义list的对象
list<结构体> lb;
list<int> lb;
list<double> lb;
构造函数
五种构造函数:
struct Node{ //定义结构体
int a;
char c;
};
void fun(Node& d){ //输出函数
cout << d.a << " " << d.c << "\n"; // \n换行比endl效率高点
}
void Haha(){ //初始值为 0
list<Node> lb; //无参构造,其中没有元素
list<Node> lb1(5); //有五个元素,初始为 0
for_each(lb1.begin(), lb1.end(), fun); //迭代器输出
}
void Haha1(){ //初始化特定值
Node no = {7, 'a'};
list<Node> lb(3, no); //','前表示一共多少个值,','后表示值是多少
list<Node> lb1(lb); //用一个list来初始化当前的list
list<Node> lb2(lb.begin(), lb.end()); //用另一个对象中的一段来初始化当前list
for_each(lb.begin(), lb.end(), fun); //输出
for_each(lb1.begin(), lb1.end(), fun); //输出
for_each(lb2.begin(), lb2.end(), fun);
}
定义list的迭代器
- 形式:多了参数列表
- 本质是
int*
指针,char就是char*
指针 begin()
指向头end ()
指向尾巴的下一个- 不能进行加法运算,可以自加 ++
void Haha2(){ //迭代器
Node no = {10, 'c'};
list<Node> lb(2,no);
list<Node>::iterator ite = lb.begin();
ite++;
list<Node> lb1(ite, lb.end());
for_each(lb.begin(), lb.end(), fun);
for_each(lb1.begin(), lb1.end(), fun);
}
属性
- 空间不连续,没有容量这个概念
- 大小:
(1)size
: 元素个数
(2)resize
: 重新设置元素个数
(3)empty
:判断是否有元素,如果有元素,返回0
,如果没有元素,返回1
void Haha3(){ //元素个数
Node no = {15, 'f'};
list<Node> lb(3,no);
cout << lb.size() << endl; //输出元素个数
cout << lb.empty() << endl; //判断是否为空,不是则返回 0
for_each(lb.begin(), lb.end(), fun);
lb.resize(2); //重新设置元素个数
cout << lb.size() << endl; //输出元素个数
for_each(lb.begin(), lb.end(), fun);
lb.resize(0); //将元素个数设置为 0个
cout << lb.empty() << endl; // 没有元素,输出 1
}
查操作
- 输出全部
(1)for循环加迭代器
(2)for_each
函数
(3)迭代器 - 输出单个元素
(1)不支持下标运算
(2)back ()
: 返回尾巴元素
(3)front()
: 返回第一个元素
void Cout(){
Node no = {11, 'q'};
list<Node> lb(4,no);
for(list<Node>::iterator ite = lb.begin(); ite != lb.end(); ite++){
cout << ite->a << " " << ite->c << endl;
}
cout << lb.back().a << " " << lb.back().c << endl;
cout << lb.front().a << " " << lb.front().c << endl;
}
主要代码如下:
#include <iostream>
#include <algorithm> //for_each函数头文件
#include <list> //list头文件
using namespace std;
struct Node{ //定义结构体
int a;
char c;
};
void fun(Node& d){ //输出函数
cout << d.a << " " << d.c << "\n"; // \n换行比endl效率高点
}
void Haha(){ //初始值为 0
list<Node> lb; //无参构造,其中没有元素
list<Node> lb1(5); //有五个元素,初始为 0
for_each(lb1.begin(), lb1.end(), fun); //迭代器输出
}
void Haha1(){ //初始化特定值 构造函数
Node no = {7, 'a'};
list<Node> lb(3, no); //','前表示一共多少个值,','后表示值是多少
list<Node> lb1(lb); //用一个list来初始化当前的list
list<Node> lb2(lb.begin(), lb.end()); //用另一个对象中的一段来初始化当前list
for_each(lb.begin(), lb.end(), fun); //输出
for_each(lb1.begin(), lb1.end(), fun); //输出
for_each(lb2.begin(), lb2.end(), fun); //输出
}
void Haha2(){ //迭代器
Node no = {10, 'c'};
list<Node> lb(2,no);
list<Node>::iterator ite = lb.begin();
ite++; // ite只可 ++,不可以进行运算 ite++(对),ite+2(错)
list<Node> lb1(ite, lb.end());
for_each(lb.begin(), lb.end(), fun); //输出
for_each(lb1.begin(), lb1.end(), fun); //输出
}
void Haha3(){ //元素个数
Node no = {15, 'f'};
list<Node> lb(3,no);
cout << lb.size() << endl; //输出元素个数
cout << lb.empty() << endl; //判断是否为空,不是则返回 0
for_each(lb.begin(), lb.end(), fun);
lb.resize(2); //重新设置元素个数
cout << lb.size() << endl; //输出元素个数
for_each(lb.begin(), lb.end(), fun);
lb.resize(0); //将元素个数设置为 0个
cout << lb.empty() << endl; // 没有元素,输出 1
}
void Cout(){
Node no = {11, 'q'};
list<Node> lb(4,no);
for(list<Node>::iterator ite = lb.begin(); ite != lb.end(); ite++){
cout << ite->a << " " << ite->c << endl;
}
cout << lb.back().a << " " << lb.back().c << endl;
cout << lb.front().a << " " << lb.front().c << endl;
}
int main(){ //主函数
Haha();
Haha1();
Haha2();
Haha3();
Cout();
system("pause");
return 0;
}