list基本概念
   
    
     功能:
    
    将数据进行链式存储
   
    
     链表(list)
    
    是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的
   
链表的组成:链表由一系列结点组成
    
     结点
    
    的组成:一个是存储数据元素的
    
     数据域
    
    ,另一个是存储下一个结点地址的
    
     指针域
    
   
    STL中的链表是一个双向循环链表
    
    
    
    由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于
    
     双向迭代器
    
   
list的优点:
- 采用用动态存储分配,不会造成内存浪费和溢出
- 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
list的缺点:
- 链表灵活,但是空间(指针域)和时间(遍历)额外消耗较大
    
     特点:
    
    list插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的
   
    
     总结:
    
    STL中
    
     list
    
    和
    
     vector
    
    是两个最常被使用的容器,各有优缺点
    
    (感觉list跟deque容器在函数语法上还是挺像的,区别在于一个是链式存储,一个是块存储)
   
    
    
    list构造函数
   
    
     函数原型
    
   
- 
     
 list<T> lst;
 
 //默认构造形式
- 
     
 list(beg,end);
 
 //将另一个list容器【beg,end)区间中的数据拷贝给本身
- 
     
 list(n,elem);
 
 //将n个elem拷贝给本身
- 
     
 list(const list &lst);
 
 //拷贝构造函数
    
     示例
    
   
//1、默认构造
list<int>L1;
for (int i = 0; i < 10; i++) {
	L1.push_back(i);
}
//2、通过区间方式进行构造
list<int>L2(L1.begin(), L1.end());
//3、n个elem构造
list<int>L3(10, 100);		//10个100
//4、拷贝构造,常用
list<int>L4(L3);
    
    
    list赋值、交换
   
    
     函数原型
    
   
赋值:
- 
     
 =
 
 //重载等号操作符
- 
     
 .assign(beg,end);
 
 //将另一个list容器【beg,end)区间中的数据拷贝赋值给本身
- 
     
 .assign(n,elem);
 
 //将n个elem拷贝赋值给本身
交换:
- 
     
 .swap(lst);
 
 //将lst与本身的数据互换
    
     示例
    
   
list<int>L1;
for(int i=0; i<10; i++){
    L1.push_back(i);
}
//1、operator=赋值
list<int>L2=L1;
//3、assign赋值
list<int>L3;
L3.assign(L1.begin(), L1.end());
//4、n个elem赋值
list<int>L4;
L4.assign(10,100);
    
    
    list大小操作
   
    
     函数原型
    
   
- 
     
 .empty();
 
 //判断容器是否为空
- 
     
 .size();
 
 //返回容器中元素的个数
- 
     
 .resize(n);
 
 //重新指定容器的长度为n,若容器变长,则以默认值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除
- 
     
 .resize(n,elem)
 
 //重新指定容器的长度为n,若容器变长,则以elem值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除
    
     示例
    
   
list<int>L1;
for(int i=0; i<10; i++){
    L1.push_back(i);
}
//判断容器是否为空
if(L1.empty()){
    cout << "L1为空" << endl;
}
else{
    cout << "L1不为空" << endl;
}
//判断容器大小,结果为10
cout << "L1的大小为" << L1.size() << endl;
//重新指定容器大小
L1.resize(15);
    
    
    list插入、删除
   
    
     函数原型
    
   
插入:
- 
 .push_front(elem);
 
 //头部插入元素elem
- 
 .push_back(elem);
 
 //尾部插入元素elem
- 
 .insert(pos, elem);
 
 //在pos位置插入元素elem,返回新数据的位置
- 
 .insert(pos, n, elem);
 
 //在pos位置插入n个元素elem
- 
 .insert(pos,beg,end);
 
 //在pos位置插入另一个容器【beg,end)区间的数据
删除:
- 
 .pop_front();
 
 //删除第一个元素
- 
 .pop_back();
 
 //删除最后一个元素
- 
 .erase(pos);
 
 //删除迭代器指向的元素,返回下一个数据的位置
- 
 .erase(beg, end);
 
 //删除【beg,end)之间的数据,返回下一个数据的位置
- 
 .clear();
 
 //删除容器中
 
 所有数据
 
- 
 .remove(elem)
 
 //删除容器中
 
 所有与elem值匹配
 
 的元素
    
    
    list数据获取
   
    list不是连续的存储空间,所以不能用
    
     .at()
    
    或者
    
     []
    
    来获取元素,其迭代器(双向迭代器)不支持随机访问,但支持++或–操作
   
    
     函数原型
    
   
- 
     
 .front();
 
 //返回第一个元素
- 
     
 .back();
 
 //返回最后一个元素
    
    
    list反转、排序
   
    
     函数原型
    
   
- 
     
 .reverse();
 
 //反转链表
- 
     
 .sort()
 
 //链表排序,默认升序(记得包含头文件
 
 <algorithm>
 
 )
    另外,对于那些支持随机访问的容器(如deque),它们的排序算法为:
    
     sort(beg,end)
    
如果想对容器进行降序排列,需要编写一个bool函数作为排序规则,代入到sort函数中
示例:bool myCompare(int v1,int v2){ //降序,让第一个数 > 第二个数 return v1 > v2; } …… list<int> L; L.sort(myCompare); //指定按照myCompare规则,从大到小
 
