当前位置: 首页 > article >正文

list的常用操作

list的介绍

list是序列容器,它允许在常数范围O(1)进行插入和删除在这段序列的任意位置,并且可以双向遍历

它是弥补vector容器的缺点,与vector有互补的韵味,

这里我们可以将其进行与vector进行对比

vector

(1)可以在序列内的任意位置随机访问

(2)插入和删除需要挪动数据,效率被影响

list

(1)不支持在任意位置随机访问

(2)支持了在任意位置的插入和删除,并且是常数时间O(1)

list的常见使用

list的操作有很多,这里我们只介绍一些比较常用的操作

(1)包头文件

要使用list向将头文件包上

#include<iostream>
#include<list>

using namespace std;

(2)头插头删尾插尾删

list的底层是双向链表自然也就支持头插头删尾插尾删

建立list对象l后,我们就可以进行使用了

list <int> l;

l.push_back(1);
l.push_back(2);
l.push_back(3);
l.push_back(4);

l.push_front(0);

l.pop_back();
l.pop_front();

(3)list的打印

list的遍历不能使用operator[]+下标进行遍历,其根本的物理结构不相同
list的遍历使用迭代器或则范围for进行遍历,其中范围for是编译器自动替换为迭代器iterator进行打印


    list<int>::iterator it = l.begin();
	while (it != l.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	for (auto e : l)
	{
		cout << e << " ";
	}
	cout << endl;

打印(2)中的结果如下

(4)反向打印迭代器

list的底层是双向循环列表,支持反向遍历打印

	list<int>::reverse_iterator rit = l.rbegin();
	while (rit != l.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;

运行结果如下

(5)修改

在迭代器以及范围for中我们可以修改list中的值,如下

	list<int>::iterator it = l.begin();
	while (it != l.end())
	{
		*it += 1;
		cout << *it << " ";
		++it;
	}
	cout << endl;

结果如下

(6)仅打印print_list

void print_list(const list<int>& l)
{
	list<int>::const_iterator it = l.begin();
	while (it != l.end())
	{
		//*it += 1;不能更改
		cout << *it << " ";
		++it;
	}
	cout << endl;
}

这里更改的话,编译器会提示错误,原因是const类型的迭代器仅能读,不能写

结果如下

(7)赋值运算符=

	list<int> lt1;
	lt1.push_back(10);
	lt1.push_back(20);
	lt1.push_back(30);
	lt1.push_back(40);

	l = lt1;
	print_list(l);

打印结果为,可知l中的原值1,2,3被赋值为10,20,30,40

(8)查找,插入,删除

list<int> lt1;
lt1.push_back(1);
lt1.push_back(2);
lt1.push_back(3);
lt1.push_back(4);
list<int>::iterator it = find(lt1.begin(),lt1.end(),3);
if (it != lt1.end())
{
	lt1.insert(it, 30);
	lt1.erase(it);
}

结果为,这里有的时候会涉及迭代器的失效,请期待下节

(9)排序

list<int> lt1;
lt1.push_back(3);
lt1.push_back(5);
lt1.push_back(1);
lt1.push_back(6);
lt1.push_back(2);
lt1.push_back(4);

print_list(lt1);

lt1.sort();

结果如下

到这里我们讲解完毕

如果对您有帮助的话点一个免费的赞和收藏叭!

由于作者水平不足,如有任何错误,请读者在评论区交流!


http://www.kler.cn/a/445251.html

相关文章:

  • 以腾讯混元模型为例,在管理平台上集成一个智能助手
  • Mac系统Android sdk的安装
  • 数据库专项训练
  • libaom 源码分析:熵编码模块介绍
  • jQuery动画(2)
  • NX二次开发通过内部函数获取面的面积MW_face_ask_area
  • SQL server学习08-使用索引和视图优化查询
  • 使用Python开发高级游戏:创建一个3D射击游戏
  • C# OpenCV机器视觉:边缘检测
  • AI、大数据、机器学习、深度学习、神经网络之间的关系
  • 视频及JSON数据的导出并压缩
  • 数据库高可用性与容灾
  • 【k8s集群应用】kubeadm1.20(单master)
  • 电脑玩《刺客信条》时中,遇到找不到d3dx9_42.dll的问题是什么原因?缺失d3dx9_42.dll应该怎么解决呢?下面一起来看看吧!
  • 如何用细节提升用户体验?
  • 第33天:安全开发-JavaEE应用SQL预编译Filter过滤器Listener监听器访问控制
  • 配置flutter 解决andriod studio报错 no device selected
  • 揭秘语言模型后训练:指令微调、偏好调优与强化学习的深度解析
  • AdminJS - 现代化的 Node.js 管理面板框架详解
  • 【系统架构设计师】真题论文: 论数据分片技术及其应用(包括解题思路和素材)
  • 在THREEJS中加载3dtile模型
  • Mysql索引类型总结
  • 【华为OD-E卷-开心消消乐 100分(python、java、c++、js、c)】
  • 【软件开发】做出技术决策
  • 2024.2 ACM Explainability for Large Language Models: A Survey
  • 基于springboot的银行账目账户管理系统