c++之list容器
list的使用方法:适合在任意位置快速插入移除元素
文章目录
前言
1、list是一个双向链表容器,可高效的进行插入删除元素
2、list不可以随机存取元素,所以不支持at.(pos)函数和[]操作符
迭代器 ++、 --可以使用,但是it+3不可以使用
list(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开的区间
一、list用法
list<int> L;
-
L.push_back(elem);//在容器尾部加入一个元素
-
L.push_front(elem);//在容器头部加入一个元素
-
L.pop_back();//删除容器中最后一个元素
-
L.pop_front();//删除容器中第一个元素
list数据存取 -
L.front();/返回第一个元素
-
L.back();//返回最后一个元素
list与迭代器 -
L.begin();//返回容器中第一个元素的迭代器
-
L.end();//返回容器中最后一个元素之后的迭代器
-
L.rbegin();//返回容器中倒数第一个元素的迭代器
10.L.rend();//返回容器中倒数最后一个元素的后面的迭代器
list 大小
10. list.size();//返回容器中元素个数
11. list.empty();//判断容器是否为空
12. list.resize(num);//重新制定容器的长度为num,若容器变长,用0填充新位置,如果变短,末尾超出容器长度元素被删除
13. list.reszie(num,elem);//重新制定容器的长度为num,若容器边长,用elem元素填充新位置,如果容器变短,末尾超出容器长度元素被删除
list 插入
-
list.insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
-
list.insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。
-
list.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值
list删除 -
list.clear(); //移除容器的所有数据
-
list.erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。
-
list.erase(pos); //删除pos位置的数据,返回下一个数据的位置。
-
list.remove(elem);//删除容器中所有与elem值匹配的元素
二、用法案例
基本用法
#include<list>
#include <iostream>
using namespace std;
void main()
{
list<int> l;
//输出结果为0
cout<<"list大小:"<<l.size()<<endl;
for(int i=0;i<10;i++)
{
l.push_back(i);//从尾部插入元素
}
//输出结果为10
cout<<"list大小:"<<l.size()<<endl;
//使用迭代器遍历 链表 输出结果:0,1,2,3,4,5,6,7,8,9
list<int>:iterator it =l.begin();
while(it!=l.end())
{
cout<<*it<<" ";
it++;
}
list链表不支持随机访问
//list链表不支持随机访问
list<int>:iterator it=l.begin();
it++;
it++;
it++;
l.insert(it,100);
//插入100的位置是 0 1 2 100 3 4 5 6 7 8 9
结论:链表的结点 index序号从0号位置开始 ,在3号位置插入元素,让原来的3号位置变成4号位置,原来的4号位
置变成5号位置
list插入操作
list<int> lstA;
list<int> lstB;
lstA.push_back(1);
lstA.push_back(3);
lstA.push_back(5);
lstA.push_back(7);
lstA.push_back(9);
lstB.push_back(2);
lstB.push_back(4);
lstB.push_back(6);
lstB.push_back(8);
lstA.insert(lstA.begin(), 11); //{11, 1, 3, 5, 7, 9}
lstA.insert(++lstA.begin(),2,33); //{11,33,33,1,3,5,7,9}
lstA.insert(lstA.begin() , lstB.begin() , lstB.end() ); //{2,4,6,8,11,33,33,1,3,5,7,9}
list删除操作
删除区间内的元素
list<int> L;
cout<<"list的大小:"<<L.size()<<endl;
for(int i=0;i<10;i++)
{
L.push_back(i);
}
//遍历list链表
for(list<int>::iterator it=L.begin();it!=end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
list<int>::iterator it1=L.begin();
list<int>::iterator it2=L.begin();
it2++;
it2++;
it2++;
L.erase(it1,it2); //左闭右开 L.erase(0,3)l
list.erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。
也就是上面删除的是0、1、2这3个元素不包括3,
删除容器中某个重复的元素
L.remove(elem);
比如链表中元素如下:12343333744323333
要删除链表中3元素
L.remove(3);
删除链表的所有元素
L.clear();
list反序排列
list.reverse(); //反转链表,比如lst包含1,3,5元素,运行此方法后,lst就包含5,3,1元素。
list<int> lstA;
lstA.push_back(1);
lstA.push_back(3);
lstA.push_back(5);
lstA.push_back(7);
lstA.push_back(9);
lstA.reverse(); //9 7 5 3 1