STL之四:链表和list

STL的list是数据结构的双向链表,他的内存空间可以是不连续的,通过指针来进行数据的访问,它可以高效率的在任意地方删除和插入,插入和删除的时间复杂度都是O(1)。

vector:插入和删除操作少,随机访问元素频繁。

list:插入和删除频繁,随机访问较少。

在vector插入一个元素之后,这个元素后面的地址全部会改变,而list不会,地址不会连续。

由于地址不是连续的,所以当用迭代器访问元素时,不能使用迭代器++、+1之类的操作。

基本使用

构造与初始化 
 
list<int> L;//声明一个存放int类型的链表 
 
list<char> L;// 声明一个存放char类型的链表 
 
list<string> L;//声明一个存放string类型的链表 
 
list<int> L{1,2,3} //声明一个链表初始化为1,2,3 
 
list<int> L(n)    //声明一个n个元素的列表,每个元素都是0
 
list<int> L(n,m)  //声明一个n个元素的列表,每个元素都是m
 
list<int> L(first, last)  //声明一个列表,其元素的初始值来源于由区间所指定的序
//列中的元素,first和last是迭代器
 
-----------------------------------------------------------------------
 
插入
 
L.assign(n, val) //将L中的所有元素替换成n个val元素
 
L.push_back(n); //在L的尾部插入元素n 
 
L.push_front(n);//在L的头部插入元素n
 
L.insert(it,100); //在it位置(即头部)插入100, 
 
L.insert(it,2,100);//在it位置插入2个100, 
 
L.insert(it,b.begin(),b.end());//在it位置插入b从开始到结束的所有位置的元素
//it为迭代器,  insert会返回插入第一个元素的位置
 
----------------------------------------------------------------------
 
删除 
 
L.erase(it);    //将L中it位置的元素删除
 
L.erase(it1,it2); //将L中[it1,it2)之间的元素删除
 
L.pop_back();  //将L中最后一个元素删除 
 
L.pop_front(); //将L中第一个元素删除
 
L.clear();//清空L中所有元素
 
L.unique();//删除相邻的重复元素
 
L.remove(n);//删除L中所有值为n的元素 
 
L.resize(n);//取L中前n个元素,剩下的全部删除
 
L.resize(n,m);//分情况 
//如果n大于原来的元素个数,后面补元素m若干个,补到L中n个元素为止
//如果n小于原来的元素个数, 取L中前n个元素,剩下的全部删除
 
--------------------------------------------------------------
 
访问 
 
for(auto &x:L) cout<<x<<' ';//佛系遍历法,适合所有容器
 
list<int>::iterator it=L.begin(); cout<<*it;//访问第一个元素
 
next(it)//返回it的下一个元素的地址 cout<<*next(it); c++11 
 
L.front();//返回L中第一个元素 
 
L.back();//返回L的最后一个元素 
 
---------------------------------------------------------------
 
查找
 
find(L.begin(),L.end(),n);//查找,返回L中第一次出现的n的迭代器
 
----------------------------------------------------------------
 
其他
 
L.size();//返回元素个数 
 
L.empty();//是否为空 
 
L.merge();//合并两个容器,前提要有序 
 
L.begin();//返回头部迭代器 
 
L.end();//返回尾部迭代器 
 
L.swap(La);//交换两个容器 

例题(hdu 1276):

Problem Description

某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。

Input

本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。

Output

共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。

Sample Input

2

20

40

Sample Output

1 7 19

1 19 37

又是一发水题...主要目的是练练手,毕竟菜,嘤嘤嘤~

代码如下:

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;  //n组输入 
	while(n--){
		int m;
		cin>>m;  //m个士兵 
		int k=2;
		list<int> l;   //定义链表l 
		for(int i=1;i<=m;i++)
		l.push_back(i);  //每个士兵代号存入链表 
		while(l.size()>3){
			int num=1;  //模仿第num个士兵 
			for(auto i=l.begin();i!=l.end();)
			if(num++%k==0) i=l.erase(i);  //如果是第k个就出列,链表里删除,i自动返回链表下一地址 
			else i++;  //没删除就判断下个士兵 
			k==2?k=3:k=2;  //每次从第二或者第三个交替 
		}
		for(auto i=l.begin();i!=l.end();i++){
			if(i!=l.begin()) cout<<" ";
			cout<<*i; //输出剩下士兵编号 
		}
		cout<<endl;
	}
	return 0;
} 

STL大法好!!!吃饭去了~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值