c基础——list

c基础——list,第1张

文章目录
  • 一、对list的理解
  • 二、使用注意事项
  • 三、几种常用的函数及其使用



提示:以下是本篇文章正文内容,下面案例可供参考

一、对list的理解

若是你学过链表之后 其实简单来说就是就是一个带头节点的双向循环链表,每一个阶段存储着前面一个结点的指针 也存放下一个节点的指针

#define Posi(T) ListNode<T>*
struct ListNode{
	T data;//数值
	Posi(T) pred;//前驱
	Posi(T) succ;//后继
}; 

与上文的容器来对比的话就是,由于是链表的形式,所以更适合插入,并且插入的时候,不会像容器一样,移动数据,指针位置是不变的,所以有大量插入 *** 作的时候优先选择链表

二、使用注意事项
  1. 由于是一种双向循环链表,也就意味着数据的存放并不是连续的,
    所以也就不支持,list.begin()+size这种 *** 作,只能通过迭代器++, --来缓慢移动

  2. begin与end是正向迭代器,对迭代器执行++ *** 作,迭代器向后移动,rbegin与dend是反向迭代器,对迭代器执行++ *** 作迭代器向前移动

三、几种常用的函数及其使用

1、iterator *** 作函数

常见函数函数功能
list< int> vec创建list对象
list< int>::iterator it使用迭代器来访问元素
常用成员函数功能
list.begin()返回指向列表中第一个元素的迭代器。

list.end()返回指向列表中最后一个元素后一个位置的迭代器。

list.rbegin()返回指向最后一个元素的反向双向迭代器。

list.rend()返回指向第一个元素所在位置前一个位置的迭代器。

|l.begin() | 返回指向容器中第一个元素的迭代器 |
|l.end()|返回指向容器的最后一个元素的位置后一个位置的迭代器|
l.rbegin()|返回指向最后一个元素的迭代器
l.rend()|返回指向第一个元素所在位置前一个位置的迭代器
*/
#include
using namespace std;
#define F(i,m,n) for(int i=m;i l){
	cout<<"此时列表中的元素是:" ;
	for(list::iterator it=l.begin();it!=l.end();it++){
		cout<<*it<<",";
	}
	cout< l){
	list::iterator it=l.begin(); 
	printf("第一个迭代器的位置是%p\n",it);
	printf("第一个迭代器的位置是上的数是%d\n",*it);
	Display(l);
} 
void IEnd(list l){
	list::iterator it=l.end(); 
	printf("最后一个迭代器的后一个位置是%p\n",it);
	printf("所以他的前面一个数是最后一个元素%d\n",*(--it)); 
	Display(l);
}
void IRFirst(list l){
	list::reverse_iterator it=l.rbegin(); 
	cout<<"倒数第一个迭代器的位置是上的数是"<<*it< l){
	list::reverse_iterator it=l.rend(); 
	cout<<"所以他的下一个元素是第一个元素是"<<*(--it)< l(a,a+5);
	while(1){
		menu();
		cin>>choice;
		if(5==choice) break;
		switch(choice){
			case 1:{IFirst(l);break;}
			case 2:{IEnd(l);break;}
			case 3:{IRFirst(l);break;}
			case 4:{IREnd(l);break;}
			default:{break;}
		}
	} 	 
	return 0;
}


介于作者的水平,同样的我也遇到了一个问题为什么地址是不一样的 既然是双向循环链表 其中最后一个迭代器的后一个位置,应该是第一个位置呀,此时的地址应该相同才对,

2、容量函数

常用函数函数功能
list.empty()判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。

size()返回当前容器实际包含的元素个数。

max_size返回可容纳的最大元素数
/*
vec.size()|返回实际元素的个数
vec.empty()|判断当前是否有元素,若无元素返回true,否则则返回false

*/
#include
#include
using namespace std;
#define F(i,m,n) for(int i=m;i<n;i++)//定义一种左闭右开的形式 
int choice,size;int flag=1;list<int> l; char c; 
/*********************功能实现函数*******************************/ 
void Display(){
	cout<<"此时的队列中的元素是"; 
	for(list<int>::iterator it=l.begin();it!=l.end();it++)
	 	cout<<*it<<",";
	cout<<endl;
}
void Size(){
	cout<<"此时的size是"<<l.size()<<endl; 
	Display();
} 
void Empty(){
	cout<<"此时的容器是否为空"<<l.empty()<<endl;
	Display();
}
/*********************** *** 作函数*************************/ 
void menu(){
	cout<<"1、查看实际元素的大小"<<endl; 
	cout<<"2、查看当前是否有元素"<<endl; 
	cout<<"3、退出"<<endl;
}
void Judge(){
		int a[100];int i=0;
		cout<<"是否增加容器中的变量"<<endl;
		cout<<"1、增加 2、不增加";
		cin>>flag; 
		if(1==flag)
		{	
			cout<<"请增加容器中的变量"<<endl;
			getchar(); 
			while(scanf("%d",&a[++i])!=EOF) l.push_back(a[i]);
		}
}
int main(){
	while(1){
		menu();
		cin>>choice;
		if(3==choice) break;
		Judge();
		switch(choice){
			case 1:{Size(); break;}
			case 2:{Empty();break;}
			default:{break;}
		}
	} 	 
	return 0;
}


ps:因为没有容器容器的概念了,所以相较于上面一篇文中,少了一些对caoacity的 *** 作

3、元素访问(可修改)

常用函数函数功能
front()返回第一个元素的引用。

back()返回最后一个元素的引用。

/*
vec.front()|返回第一个元素的引用
vec.back|返回最后一个元素的引用
*/
#include
#include
using namespace std;
#define F(i,m,n) for(int i=m;i<n;i++)//定义一种左闭右开的形式 
int choice,size,val;int flag=1;list<int> l; char c; 
/*********************功能实现函数*******************************/ 
void Display(){
	cout<<"此时的队列中的元素是"; 
	for(list<int>::iterator it=l.begin();it!=l.end();it++)
	 	cout<<*it<<",";
	cout<<endl;
}
int Front(){
	cout<<"第一个元素的引用是"<<l.front()<<endl; 
	cout<<"你想修改成什么"<<endl; 
	cin>>val;l.front()=val;
	cout<<"此时第一个元素的值是"<<l.front()<<endl; 
	Display();
} 
int Back(){
	cout<<"最后一个元素的引用是"<<l.back()<<endl; 
	cout<<"你想修改成什么"<<endl; 
	cin>>val;l.back()=val;
	cout<<"此时最后一个元素的值是"<<l.back()<<endl; 
	Display();	
}
/*********************** *** 作函数*************************/ 
void menu(){
	cout<<"1、返回第一个元素的引用" <<endl;
	cout<<"2、返回最后一个函数的引用"<<endl;
	cout<<"3、展示当前列表"<<endl; 
	cout<<"4、退出"<<endl;
}
void Judge(){
		int a[100];int i=0;
		cout<<"是否增加列表中的变量"<<endl;
		cout<<"1、增加 2、不增加"<<endl;;
		cin>>flag; 
		if(1==flag)
		{	
			cout<<"请增加列表中的变量"<<endl;
			getchar(); 
			while(scanf("%d",&a[++i])!=EOF) l.push_back(a[i]);
		}
}
int main(){
	while(1){
		menu();
		cin>>choice;
		if(4==choice) break;
		Judge();
		switch(choice){
			case 1:{Front();break;}
			case 2:{Back();break;}
			case 3:{Display();break;}
			default:{break;}
		}
	} 	 
	return 0;
}

4、更行(修改) *** 作

常用函数函数功能
assign()用新元素替换容器中原有内容。

emplace_front()在容器头部生成一个元素。

该函数和 push_front() 的功能相同,但效率更高。

push_front()在容器头部插入一个元素。

pop_front()删除容器头部的一个元素。

emplace_back()在容器尾部直接生成一个元素。

该函数和 push_back() 的功能相同,但效率更高。

push_back()在容器尾部插入一个元素。

pop_back()删除容器尾部的一个元素。

pop()通过指定索来删除元素,若是没有索引默认输出最后一个元素,返回值,删除的元素
emplace()在容器中的指定位置插入元素。

该函数和 insert() 功能相同,但效率更高。

insert()在容器中的指定位置插入元素。

erase()删除容器中一个或某区域内的元素。

swap()交换两个容器中的元素,必须保证这两个容器中存储的元素类型是相同的。

clear()删除容器存储的所有元素,返回值为空列表。

remove(val)删除容器中值等于 val 没有返回值。

remove_if()删除容器中满足条件的元素。

但是并没有真正移除 而是返回满足条件 的指针,所以很多时候配合earse与有序list来用

unique()删除容器中相邻的重复元素,只保留一个。

/*vec.assign()|使用新元素来代替原有的内容
vec.push_back(a)|在序列的末尾添加一个元素
vec.pop_back()|移除序列尾部的元素
vec.insert(vec.begin()+i,a)|在指定位置插入一个或者多个元素
vec.erase(vec.begin()+2)/vec.rease(vec.begin()+i,vec.begin()+j)|移除第三个元素/移除第[i,j)
vec.clear()|移除所有元素 列表大小变为零
swap()|交换两个列表的所有元素
emplace()|在指定位置直接生成一个元素
emplace_back()|在序列尾部生成一个元素 
与上一个容器的区别在于,不能直接加上数字,来进行区间的跳转 
*/
#include
#include
using namespace std;
#define F(i,m,n) for(int i=m;i<n;i++)//定义一种左闭右开的形式 
int choice,size,val;int flag=1;list<int> l; char c; 
list<int>::iterator it,BeginIt=l.begin(),EndIt=l.begin(); //后面这两个用来做区间 
/*需要定义两个迭代器,来确定区间,*/ 
/*********************功能实现函数*******************************/ 
void Display(){
	cout<<"此时的队列中的元素是"; 
	for(list<int>::iterator it=l.begin();it!=l.end();it++)
	 	cout<<*it<<",";
	cout<<endl;
}
void Assign(){ //;三种方式 一种是替换元素保留个数,一种是 使用迭代器来确定区间  只有这区间的数被保留 
	int beg,end; 
	cout<<"请选择方式"<<endl;
	cout<<"1、一种是替换元素保留个数"<<endl;
	cout<<"2、使用迭代器来确定区间" <<endl;
	cin>>flag;
	if(1==flag){
		cout<<"请输入你想替换的元素"<<endl; 
		cin>>val; 
		cout<<"请输入你还想留几个元素"<<endl; 
		cin>>size;
		l.assign(size,val);
	}
	else{
		cout<<"请输入你想替换的区间";
		cin>>beg>>end;it=l.begin();
		while(beg--) BeginIt++;
		while(end--) EndIt++;
		l.assign(BeginIt,EndIt);  
	}
	Display();		
} 
void Push_back(){
	cout<<"请输入你要添加的值"<<endl;
	cin>>val;
	l.push_back(val);
	Display(); 
}
void Pop_back(){
	cout<<"将会d出列表最后一个元素";
	l.pop_back();
	Display(); 
}
void Insert(){
	int beg;int n;int val;
	cout<<"请输入你要的位置(size)之前以及n个val"<<endl;
		cin>>beg>>n>>val;
		while(beg--) BeginIt++;
	l.insert(BeginIt,n,val);
	Display();
}
void Erase(){//移除某一个区间或者某一个确定位置的元素
	int beg,end; 
	cout<<"请输入你想去除的区间(1)或位置(2)"<<endl;
	cin>>flag; 
		if(1==flag){
			cin>>beg>>end;
			while(beg--){BeginIt++;};
			while(end--){EndIt++;};
			l.erase(BeginIt,EndIt);
			}
		else{
			cout<<"请输入一个位置";
			cin>>size;
			//l.pop(size);提示没有pop函数,我没有实现 
		}
		Display();
}
void Clear(){//移除所有的元素,容量清零
	int beg;int end1;
	cout<<"请问你要删除什么类型的元素"<<endl;
	cout<<"1、清除值为val的元素"<<endl;
	cout<<"2、删除容器中相邻的重复元素"<<endl; 
	cout<<"3、清除所有的元素"<<endl; 
	cin>>choice;
	switch(choice){
		case 1:{
			cout<<"请输入你要删除的值(val)"<<endl;
			cin>>val;
			printf("%d",val);
			l.remove(val);Display();
			break;
		}
		case 2:{
			cout<<"删除重复值之后"<<endl;
			l.unique();
			Display();
			break;
		}
		case 3:{
			cout<<"清除所有的元素"<<endl;
			l.clear(); Display();
			break;
		}
		default:break;
	}
}
void Swap(){//交换两个列表 
	int b[100];int i=0;
	list<int> l1;
	cout<<"请再输入一个列表"<<endl;
	while(scanf("%d",&b[++i])!=EOF) l1.push_back(b[i]);
	swap(l,l1);
}
void Emplace(){//再指定位置生成一个元素
	cout<<"请输出再size位置放入元素val"<<endl;
	cin>>size>>val;
	while(size--){BeginIt++;};
	l.emplace(BeginIt,val);
	Display(); 
}
void Emplace_back(){
	cout<<"请输出一个val"<<endl; 
	cin>>val;
	l.emplace_back(val);
	Display();
}

/*********************** *** 作函数*************************/ 
void menu(){
	cout<<"1、使用新元素来代替原有的内容"<<endl;
	cout<<"2、在序列的末尾添加一个元素"<<endl;
	cout<<"3、移除序列尾部的元素"<<endl;
	cout<<"4、在指定位置插入一个或者多个元素"<<endl;
	cout<<"5、移除某一个区间或者某一位置的元素"<<endl;
	cout<<"6、移除元素(包括某一特定的值,所有)"<<endl;
	cout<<"7、交换两个列表的所有元素"<<endl;
	cout<<"8、在指定位置直接生成一个元素"<<endl;
	cout<<"9、在序列尾部生成一个元素"<<endl;
	cout<<"10、展示当前列表"<<endl; 
	cout<<"11、退出"<<endl;
}
void Judge(){
		int a[100];int i=0;
		cout<<"是否增加列表中的变量"<<endl;
		cout<<"1、增加 2、不增加"<<endl;;
		cin>>flag; 
		if(1==flag)
		{	
			cout<<"请增加列表中的变量"<<endl;
			getchar(); 
			while(scanf("%d",&a[++i])!=EOF) l.push_back(a[i]);
		}
}
int main(){
	while(1){
		menu();
		cin>>choice;
		if(11==choice) break;
		Judge();
		switch(choice){
			case 1:{Assign();break;}
			case 2:{Push_back();break;}
			case 3:{Pop_back();break;}
			case 4:{Insert();break;}
			case 5:{Erase();break;}
			case 6:{Clear();break;}
			case 7:{Swap();break;}
			case 8:{Emplace();break;}
			case 9:{Emplace_back();break;}
			case 10:{Display();break;}
			default:{break;}
		}
	} 	 
	return 0;
}

这个就不发截图了,因为实在是太多,可以自己尝试一下哦
5、 *** 作函数

常用函数基本功能
merge()合并两个事先已排好序的 list 容器,并且合并之后的 list 容器依然是有序的。

sort()通过更改容器中元素的位置,将它们进行排序。

sort(reverse=True)从小到大排序
reverse()反转容器中元素的顺序
/*
merge()|合并两个事先已排好序的 list 容器,并且合并之后的 list 容器依然是有序的。

sort()|通过更改容器中元素的位置,将它们进行排序。

sort(reverse=True)|从小到大排序| reverse()|反转容器中元素的顺序 |count()|统计某个元素出现的次数| |index|返回某值子啊列表中出现的索引(找不到就报错)| */ #include #include using namespace std; #define F(i,m,n) for(int i=m;i<n;i++)//定义一种左闭右开的形式 int choice,size,val;int flag=1;list<int> l; char c; list<int>::iterator it,BeginIt=l.begin(),EndIt=l.begin(); //后面这两个用来做区间 /*需要定义两个迭代器,来确定区间,*/ /*********************功能实现函数*******************************/ void Display(){ cout<<"此时的队列中的元素是"; for(list<int>::iterator it=l.begin();it!=l.end();it++) cout<<*it<<","; cout<<endl; } void Merge(){//合并两个有序list list<int> l1;int a[10]={0};int i=0; cout<<"请在输出一个序列"<<endl; while(scanf("%d",&a[++i])!=EOF) l1.push_back(a[i]); l.merge(l1); Display(); } void Sort(){ cout<<"请问你要用何种方式输出"<<endl; cout<<"1、从小到大,2、从大到小"<<endl; cin>>flag; if(1==flag) {l.sort();}; else l.sort(reverse=True); } void Reverse(){ l.reverse(); Display(); } /*********************** *** 作函数*************************/ void menu(){ cout<<"1、合并两个数组"<<endl; cout<<"2、将列表中数字按照从大到小的输出"<<endl; cout<<"3、将列表中值反转"<<endl; cout<<"4、展示当前列表"<<endl; cout<<"5、退出"<<endl; } void Judge(){ int a[100];int i=0; cout<<"是否增加列表中的变量"<<endl; cout<<"1、增加 2、不增加"<<endl;; cin>>flag; if(1==flag) { cout<<"请增加列表中的变量"<<endl; getchar(); while(scanf("%d",&a[++i])!=EOF) l.push_back(a[i]); } } int main(){ while(1){ menu(); cin>>choice; if(11==choice) break; Judge(); switch(choice){ case 1:{ Merge(); break; } case 2:{ Sort(); break; } case 3:{ Reverse(); break; } case 4:{ Display(); break; } default:break; } } return 0; }


本文参考来自
————————————————

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/674312.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存