一、简介

STL中封装了链表的容器list,内部实现是一个双向链表

不同于vector,list中每个元素在内存中的地址是不连续且没有规律的,所以用list进行插入和删除时间复杂度比vector低很多,

例如在vector插入一个元素之后,这个元素后面的地址全部会改变,而list不会,地址不会连续

由于地址不是连续的,所以当用迭代器访问元素时,不能使用迭代器++、+1之类的操作

 

二、基本使用

构造与初始化 

list<int> L;//声明一个存放int类型的链表 

list<char> L;// 声明一个存放char类型的链表 

list<string> L;//声明一个存放string类型的链表 

list<int> L{1,2,3} //声明一个链表初始化为1,2,3 

list<int> L(n)    //声明一个n个元素的列表,每个元素都是0

list<int> L(n,m)  //声明一个n个元素的列表,每个元素都是m

list<int> L(first, last)  //声明一个列表,其元素的初始值来源于由区间所指定的序
//列中的元素,first和last是迭代器

-----------------------------------------------------------------------

插入
 
L.assign(n, val) //将L中的所有元素替换成n个val元素

L.push_back(n); //在L的尾部插入元素n 

L.push_front(n);//在L的头部插入元素n

L.insert(it,100); //在it位置(即头部)插入100, 

L.insert(it,2,100);//在it位置插入2个100, 

L.insert(it,b.begin(),b.end());//在it位置插入b从开始到结束的所有位置的元素
//it为迭代器,  insert会返回插入第一个元素的位置

----------------------------------------------------------------------

删除 

L.erase(it);    //将L中it位置的元素删除

L.erase(it1,it2); //将L中[it1,it2)之间的元素删除

L.pop_back();  //将L中最后一个元素删除 

L.pop_front(); //将L中第一个元素删除

L.clear();//清空L中所有元素

L.unique();//删除相邻的重复元素

L.remove(n);//删除L中所有值为n的元素 

L.resize(n);//取L中前n个元素,剩下的全部删除

L.resize(n,m);//分情况 
//如果n大于原来的元素个数,后面补元素m若干个,补到L中n个元素为止
//如果n小于原来的元素个数, 取L中前n个元素,剩下的全部删除

--------------------------------------------------------------

访问 

for(auto &x:L) cout<<x<<' ';//佛系遍历法,适合所有容器

list<int>::iterator it=L.begin(); cout<<*it;//访问第一个元素

next(it)//返回it的下一个元素的地址 cout<<*next(it); c++11 

L.front();//返回L中第一个元素 

L.back();//返回L的最后一个元素 

---------------------------------------------------------------

查找
 
find(L.begin(),L.end(),n);//查找,返回L中第一次出现的n的迭代器

----------------------------------------------------------------

其他
 
L.size();//返回元素个数 

L.empty();//是否为空 

L.merge();//合并两个容器,前提要有序 

L.begin();//返回头部迭代器 

L.end();//返回尾部迭代器 

L.swap(La);//交换两个容器