链表我们在C 语言数据结构中已经有笔记说明了,list和vector的区别其实就相对于数组和链表的区别
vector是内存连续的结构,list是内存不连续的结构 二者的对比我之前已经在笔记中专门有一篇说这个的 传送门https://cloud.tencent.com/developer/article/2338529
总之,根据他们特性的差异可以格局自己的具体场合来选择合适STL模型 以提高程序的性能为主
list的头文件和命名空间
#include<list>
using namespace std;在std标准命名空间中
List的定义
list是动态链表 跟vector一样 他也能够应对各种类型,它是一个类模板 例如
list<int> list_int;
//定义了一个内部元素是int的链表
list<char> list_int;
//定义了一个内部元素是char的链表
list<Books> list_int;
//定义了一个内部元素是Books的链表
list<char*> list_int;
//定义了一个内部元素是char*的链表
而且容量大小没有限制
list的初始化
初始化的方法也是有多种,
代码语言:javascript复制#include <list>
int main (int argc, char* argv[])
{
std::list<int> one; //定义一个空的、元素类型是 int 的 list 链表
std::list<int> two(4,100); //定义一个包含4个元素,每个元素的值都是100的 list 链表
std::list<int> three(two.begin(),two.end()); //使用 two 这个对象的迭代器,从开始到结束的所有元素来初始化当前对象
std::list<int> four(three); // 使用 three 这个对象来初始化当前对象
int myints[] = {16,2,77,29};
std::list<int> five (myints, myints sizeof(myints) / sizeof(int) ); //使用一个普通的 int 数组来初始化当前对象
return 0;
}
同时我们也可以通过
代码语言:javascript复制#include<list>
#include<vector>
using namespace std;
int main()
{
vector<int>arr_int(20,2);
list<int>arr_list(arr_int.begin(),arr_int.end());
}
将vector对象的数据初始化为list的数据
list的常用基本操作
list<int> list_int;
① list_int.size(); //返回 list_int 链表元素的总个数
② list_int.front(); //返回 list_int 链表的第一个元素的值
③ list_int.back(); //返回 list_int 链表的最后一个元素的值
④ list_int.clear(); //清空 list_int 链表,即把里面的所有元素都删除
⑤ list_int.begin(); //返回 list_int 链表第一个数的迭代器
⑥ list_int.end(); //返回 list_int 链表最后一个数的迭代器
⑦ list_int.empty(); //判断 list_int 链表是否为空,如果为空则返回true,非空(有元素)则返回false
⑧ list_int.swap(v1); //v1是另一个动态链表,将 list_int 和 v1 两个链表的元素互换
⑨ list_int.reverse(); //把 list 中的元素顺序倒转
⑩ list_int.sort(); // 给list排序
a list_int.splice(list_int.begin(), list_2); //将两个list合并
list的动态插入
list 支持的动态插入也有多种方式:
①、调用 push_back 在尾部插入一个元素,只能是一个一个插入:list_int.push_back(3);
②、调用 push_front 在头部插入一个元素,只能是一个一个插入:list_int.push_front(2);
③、调用 insert 在第一个元素的前面插入一个元素,list_int.insert(list_int.begin(), 888);
④、调用 insert 在第一个元素的前面插入3个888元素,list_int.insert(list_int.begin(), 3, 888);
list 的动态删除
①、list_int.pop_back(); //删除 list_int动态链表的最后一个元素
②、list_int.erase(list_int.begin()); //删除第一个元素
③、list_int.erase(itor, list_int.end()); //删除中间的元素
list 的遍历
因为是 list 不是数组,所以不能用下标来遍历,只能用迭代器来遍历,如下:
for (list<int>::iterator itor =list_int.begin(); itor !=list_int.end(); itor)
{
int value = *itor;
cout << "value = " << value << endl;
}
homework
定义一个 int 类型的 list 动态链表,将以下元素:1, 4, 3, 7, 9, 3, 6, 8, 3, 5, 2, 3, 7 插入到动态链表中。之后,使用 for 循环删除动态链表中的值为 3 的元素,并将结果输出出来!
代码语言:javascript复制#include<list>
#include<vector>
#include<iostream>
using namespace std;
int main()
{
int arr_list[] = { 1, 4, 3, 7, 9, 3, 6, 8, 3, 5, 2, 3, 7 };
list<int> list_(arr_list, arr_list sizeof(arr_list) / sizeof(int));
for (list<int>::iterator pr = list_.begin(); pr!= list_.end(); pr )
{
if (*pr == 3)
{
pr = list_.erase(pr);
}
cout << " list_ = :" << *pr;
}
}