视频:
#include<iostream>
using namespace std;
#include<list>
void printl(list<int>l)
{
list<int>::iterator it=l.begin();
while(it!=l.end())
{
cout<<*it<<" ";
it++;
}
cout<<endl;
}
//构造,初始化list
void te1()
{
list<int>l,l2;
for(int i=1;i<=3;i++)l.push_back(i);
for(int i=4;i<=6;i++)l.push_front(i);
cout<<"l=";printl(l);
l2=l;
cout<<"l2=";printl(l2);
list<int>l3(l);
cout<<"l3=";printl(l3);
cout<<"l.front()="<<l.front()<<" "<<"l.end()="<<l.back();
list<int>::iterator it=l.begin();
it++;
cout<<*it<<endl;
list<int>l4(5,100);
cout<<"l4=";printl(l4);
//list不支持+=2;只支持单目运算符
// it+=2;
// cout<<*it;
}
//增加减少数据
void te2()
{
list<int>l;
// push_back(int n)/push_front( int n)在list的尾部/头部增加一个元素n
for(int i=1;i<=3;i++)l.push_back(i);
for(int i=4;i<=6;i++)l.push_front(i);
printl(l);
// pop_back()/pop_front()在list的尾部/头部减少以一个元素
l.pop_back();
l.pop_front();
cout<<"l=";printl(l);
//insert(const_iterator pos,elm)在pos位置插入一个elm
list<int>::iterator it=l.begin();
it++;
l.insert(it,520);
cout<<"l=";printl(l);
//insert(const_iterator pos,n,elm)在pos位置插入n个elm
it++;
l.insert(it,2,1314);
cout<<"l=";printl(l);
//可以观察到it的位置会随着insert的位置改变而改变
//例如在l中,我们给it定义的位置是l.begin()++;
//但是我们在it位置加入一个520后it的位置就在520后面了
//在实际情况中,我们记住迭代器it所指的方向是几号位置的那个数
//我理解成因为迭代器是算法用来指向容器的方式
//list可以是一个容器包含一个数字,如3个元素list里面有三个容器
//迭代器是指向的那个具体的容器,不会因为所有容器的位置的变动而指向的数字在变
//在l中,一开始list指向的是begin后面++,那就容器指向的是后面那个容器2
// 就算容器2的前面后面加了10000个元素,it所指向的迭代器还是容器2
//那么我们在it位置insert了2个1314,但是it位置还是指向数字4的那个容器
//insert(const_iterator pos,const_iterator satr,const_iterator end)在pos位置插入[start,end)
list<int>l1;
it=l.begin();
it++;
for(int i=1;i<=6;i++)l1.push_back(i);
it=l.begin();
it++;
list<int>::iterator it1=l.begin();
it1++;it1++;it1++;it1++;
cout<<"l1=";printl(l1);
list<int>::iterator itl=l1.begin();
itl++;itl++;
l1.insert(itl,it,it1);
// l1.insert((l1.begin()++),(l.begin()+3),(l.end()+6));//错误,list的是不能进行+2,+3这类操作
cout<<"l1=";printl(l1);
//erase
//erase(const_iterator satr,const_iterator end)//删除[start,end)之间的数字
for(int i=3;i>=0;i--)
{
it++;it1++;
}
it1--;
cout<<"l=";printl(l);
l.erase(it,it1);
cout<<"l=";printl(l);
l.pop_front();
it=l.begin();
it++;
cout<<"l=";printl(l);
l.erase(it);
// it++;
cout<<"l=";printl(l);
it=l.begin();
it++;
l.erase(it);
cout<<"l=";printl(l);
//size,empty的使用 //没有capacity,因为内存是一个数字一个内存,所以可以无线延长
cout<<"l.size()="<<l.size()<<endl;
if(!l.empty())
{
cout<<"l=";printl(l);
}
else{
cout<<"l是空的";
}
l.clear();
l.push_back(5);
l.push_back(4);
l.push_back(2);
l.push_back(6);
l.push_back(1);
l.push_back(3);
cout<<"l=";printl(l);
//l不能用algorithm之中附带的sort和reverse函数
// 但是list之中带了
l.sort();
cout<<"l=";printl(l);
l.reverse();
cout<<"l=";printl(l);
}
void te3()
{
list<int>l;
for(int i=1;i<=6;i++)l.push_back(i);
list<int>::iterator it=l.begin();
printl(l);
cout<<*it<<endl;
it++;
l.erase(it);printl(l);
//这个时候it指向的是被删除的那个容器
l.erase(it);printl(l);
//此时it指向的那个容器的那个数字不在list之中
//那么这个迭代器就会失效
//同insert一样,迭代器是指向容器的,不是相对于整个list容器来言
//所以后面的l.erase(it)
//总结:
//直接对已失效的迭代器进行二次 erase 操作会导致未定义行为
//可能的后果:程序崩溃、数据损坏、删除错误元素等。
//标准规定:操作失效的迭代器是未定义行为(UB)
//核心原则:
//永远不要使用失效的迭代器!
//必须通过 erase 的返回值更新迭代器。
}
//拷贝构造和swap交换
void te4()
{
list<int>l,l2;
for(int i=1;i<=6;i++)l.push_back(i);
// assign
// assign(int n,int elm)//拷贝n个elm
l2.assign(2,520);
cout<<"l2="; printl(l2);
// assign(const_iterator satr,const_iterator end)//拷贝[start,end)之间的数字
list<int>::iterator it=l.begin();
it++;
list<int>::iterator it1=l.begin();
for(int i=4;i>=0;i--)it1++;
l2.assign(it,it1);
cout<<"l2="; printl(l2);
// swap
l.swap(l2);
cout<<"l="; printl(l);
cout<<"l2="; printl(l2);
}
int main()
{
// te1();
// te2();
te4();
// erase的使用注意
// te3();
// printf("青宝我爱你~");
return 0;
}