简介
STL中的list是一种双循环链表的存储结构,物理存储单元上非连续,数据元素的逻辑顺序是通过链表中的指针链接实现的。链表由一系列结点组成,结点包括存储数据元素的数据域,以及存储前一个结点和后一个结点的地址的指针域。
由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器。简单说就是list的迭代器只能自增或自减,不能使用“+”与其他数相加。
优点:可以快速删除或插入某一个元素。
缺点:占用空间大,遍历麻烦。
1.遍历
void PrintfList(list<int> l)
{
for(list<int>::iterator it=l.begin();it!=l.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
2.创建
1.默认创建
list<int> l0;
2.拷贝创建
list<int> l1(l0);
list<int> l2(l0.begin(),l0.end());
3.等号赋值创建
list<int> l3;
l3=l0;
4.创建含有n个相同元素的List
list<int> l4(3,9);
实例:
//创建02
void test02()
{
//默认创建
list<int> l0;
l0.push_back(21);
l0.push_back(22);
l0.push_back(23);
PrintfList(l0);
//拷贝创建
list<int> l1(l0);
PrintfList(l1);
list<int> l3(l0.begin(),l0.end());
PrintfList(l2);
//等号赋值创建
list<int> l3;
l3=l0;
PrintfList(l3);
//创建含有3个9的容器
list<int> l4(3,9);
PrintfList(l4);
}
运行结果图:
3.增加元素
首部添加元素:
l.push_front(elem);
尾部添加元素:
l.push_back(elem);
利用insert()函数添加元素:
l.insert(it,elem);
实例:
//03增加元素
void test03()
{
//
list<int> l0;
list<int> l1;
l0.push_back(30);
l0.push_back(30);
PrintfList(l0);
//首部添加元素9
l0.push_front(9);
PrintfList(l0);
//尾部添加元素9
l0.push_back(9);
PrintfList(l0);
//第一个元素后添加一个元素
list<int>::iterator it=l1.begin();
l1.insert(++it,01);
PrintfList(l1);
//第一个元素后添加多个相同元素
it=l1.begin();
l1.insert(++it,3,02);
PrintfList(l1);
}
运行结果图:
4.删除元素
首部删除元素:
l.pop_front();
尾部添加元素:
l.pop_back();
删除容器中所有值为elem的元素:
l.remove(elem);
实例;
//删除元素04
void test04()
{
list<int> l0;
l0.push_back(41);
l0.push_back(42);
l0.push_back(42);
l0.push_back(43);
l0.push_back(43);
l0.push_back(44);
l0.push_back(45);
l0.push_back(46);
l0.push_back(47);
PrintfList(l0);
//开头删除元素
l0.pop_front();
PrintfList(l0);
//结尾删除元素
l0.pop_back();
PrintfList(l0);
//删除容器中所有值为9的元素
l0.remove(9);
PrintfList(l0);
}
运行结果图:
5.判空和计算容量
List容器中判空使用empty()函数,若容器为空,则返回True,否则返回False。
l.empty();
计算容量使用size()函数
l.size();
实例:
//05判空和计算容量
void test05()
{
list<int> l0(3,9);
if(l0.empty()==0)
{
cout<<"非空"<<endl;
cout<<"l0中元素个数为:"<<l0.size();
}
}
运行结果图:
6.重定义容量
List容器中使用resize()函数重定义容量,若重定义之后容量变大,则使用给定值填充(给定值默认为0),若重定义之后容量变小,则自动删除多余元素。
l.resize();
实例:
//06重定义容量
void test06()
{
list<int> l0(3,9);
PrintfList(l0);
l0.resize(9,1);
PrintfList(l0);
l0.resize(2);
PrintfList(l0);
}
运行结果图:
7.查找和修改
List容器中没有给定的查找函数,可以使用使用迭代器遍历对容器中的元素进行查询和修改。
实例:
//07查找与修改
void test07()
{
list<int> l0;
l0.push_back(71);
l0.push_back(72);
l0.push_back(73);
l0.push_back(72);
l0.push_back(73);
l0.push_back(73);
PrintfList(l0);
for(list<int>::iterator it=l0.begin();it!=l0.end();it++)
{
if(*it==72)
{
*it=9;
}
}
PrintfList(l0);
}
运行结果图:
8.访问元素
List访问容器只可以访问首元素和尾元素。
List容器属于关联式容器,其迭代器是双向不可随机访问迭代器,只能自增或者自减,不能用迭代器加某个常数(跳跃访问),+1也不行。
首元素:
l.front();
尾元素:
l.back();
实例:
//08访问元素
void test08()
{
list<int> l0;
l0.push_back(81);
l0.push_back(82);
l0.push_back(83);
PrintfList(l0);
cout<<"首元素为:"<<l0.front()<<endl;
cout<<"尾元素为:"<<l0.back()<<endl;
}
运行结果图:
9.排序
List容器中排序使用sort()函数,默认从小到大排序,如需要从大到小排序,可以先从小到大排序后反转容器,或者自定义sort()函数的排序参数。
从小到大排序:
l.sort();
从大到小排序 :
l.sort(Compare0);
l.sort();
l.reverse();
实例:
//09排序
bool Compare0(int a, int b)
{
return a > b;
}
void test09()
{
list<int> l0;
l0.push_back(91);
l0.push_back(99);
l0.push_back(93);
l0.push_back(96);
l0.push_back(93);
l0.push_back(94);
PrintfList(l0);
list<int> l1(l0);
//从小到大
cout<<"从小到大:"<<endl;
l0.sort();
PrintfList(l0);
//从大到小
//1.自定义规则
cout<<"从大到小的第一种:"<<endl;
l0.sort(Compare0);
PrintfList(l0);
//2.利用反转函数
cout<<"从大到小的第二种:"<<endl;
l1.sort();
l1.reverse();
PrintfList(l1);
}
运行结果图:
10.清空容器
List容器中使用clear()函数清空容器。
l.clear();
实例:
//010清空容器
void test010()
{
list<int> l0(3,9);
cout<<"清空前容器中元素数量为:"<<l0.size()<<endl;
PrintfList(l0);
l0.clear();
cout<<"清空之后容器中元素数量为:"<<l0.size()<<endl;
}
运行结果图:
11.所有实例源代码
#include<iostream>
#include<list>
using namespace std;
void PrintfList(list<int> l)
{
for(list<int>::iterator it=l.begin();it!=l.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
//创建02
void test02()
{
//
list<int> l0;
l0.push_back(21);
l0.push_back(22);
l0.push_back(23);
PrintfList(l0);
//
list<int> l1(l0);
PrintfList(l1);
//
list<int> l2;
l2=l0;
PrintfList(l2);
//
list<int> l3(l0.begin(),l0.end());
PrintfList(l3);
//
list<int> l4(9,9);
PrintfList(l4);
}
//增加元素03
void test03()
{
//
list<int> l0;
list<int> l1;
l0.push_back(30);
l0.push_back(30);
PrintfList(l0);
//开头添加元素9
l0.push_front(9);
PrintfList(l0);
//结尾添加元素9
l0.push_back(9);
PrintfList(l0);
//第一个元素后添加一个元素
list<int>::iterator it=l1.begin();
l1.insert(++it,01);
PrintfList(l1);
//第一个元素后添加多个相同元素
it=l1.begin();
l1.insert(++it,3,02);
PrintfList(l1);
}
//删除元素04
void test04()
{
list<int> l0;
l0.push_back(41);
l0.push_back(42);
l0.push_back(42);
l0.push_back(43);
l0.push_back(43);
l0.push_back(44);
l0.push_back(45);
l0.push_back(46);
l0.push_back(47);
PrintfList(l0);
//开头删除元素
l0.pop_front();
PrintfList(l0);
//结尾删除元素
l0.pop_back();
PrintfList(l0);
//删除容器中所有值为9的元素
l0.remove(9);
PrintfList(l0);
}
//05判空和计算容量
void test05()
{
list<int> l0(3,9);
if(l0.empty()==0)
{
cout<<"非空"<<endl;
cout<<"l0中元素个数为:"<<l0.size();
}
}
//06重定义容量
void test06()
{
list<int> l0(3,9);
PrintfList(l0);
l0.resize(9,1);
PrintfList(l0);
l0.resize(2);
PrintfList(l0);
}
//07查找与修改
void test07()
{
list<int> l0;
l0.push_back(71);
l0.push_back(72);
l0.push_back(73);
l0.push_back(72);
l0.push_back(73);
l0.push_back(73);
PrintfList(l0);
for(list<int>::iterator it=l0.begin();it!=l0.end();it++)
{
if(*it==72)
{
*it=9;
}
}
PrintfList(l0);
}
//08访问元素
void test08()
{
list<int> l0;
l0.push_back(81);
l0.push_back(82);
l0.push_back(83);
PrintfList(l0);
cout<<"首元素为:"<<l0.front()<<endl;
cout<<"尾元素为:"<<l0.back()<<endl;
}
//09排序
bool Compare0(int a, int b)
{
return a > b;
}
void test09()
{
list<int> l0;
l0.push_back(91);
l0.push_back(99);
l0.push_back(93);
l0.push_back(96);
l0.push_back(93);
l0.push_back(94);
PrintfList(l0);
list<int> l1(l0);
//从小到大
cout<<"从小到大:"<<endl;
l0.sort();
PrintfList(l0);
//从大到小
//1.自定义规则
cout<<"从大到小的第一种:"<<endl;
l0.sort(Compare0);
PrintfList(l0);
//2.利用反转函数
cout<<"从大到小的第二种:"<<endl;
l1.sort();
l1.reverse();
PrintfList(l1);
}
//010清空容器
void test010()
{
list<int> l0(3,9);
cout<<"清空前容器中元素数量为:"<<l0.size()<<endl;
PrintfList(l0);
l0.clear();
cout<<"清空之后容器中元素数量为:"<<l0.size()<<endl;
}
int main()
{
//
//test02();
//
//test03();
//
//test04();
//
//test05();
//
//test06();
//
//test07();
//
//test08();
//
//test09();
//
//test010();
return 0;
}