Bootstrap

容器链表list的学习

视频:

https://www.bilibili.com/video/BV1TG411A7sZ?spm_id_from=333.788.videopod.episodes&vd_source=e5ef53bcd02c60bc6cb52e706517483f&p=11

#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;
}




















;