STL中list常用操作

news/2024/12/28 17:49:02/文章来源:https://www.cnblogs.com/baobaobashi/p/18637734

1、什么是list容器

  • list是一个双向链表容器,可以在任意位置快速插入或删除元素,但是随机访问元素的速度较慢。
  • list不可以随机访问,只能通过迭代器访问。所以不支持.at()和[]操作符。
it++ //right;
it + 5; //error

2、头部和尾部操作

    //获取链表第一个结点int x = l1.front();x = l1.front();//获取链表最后一个结点x = l1.back();//将第一个结点的值改为10l1.front() = 10;

3、list与迭代器

list的迭代器是双向迭代器,不支持随机访问,只能通过++或--来移动迭代器。

正向迭代器:

//正向迭代器例子:list<int> l1 = {1, 2, 3, 4, 5};list<int>::iterator it = l1.begin();while (it != l1.end()) {cout << *it << " ";it++;}

反向迭代器:

    //反向迭代器例子:list<int> l1 = {1, 2, 3, 4, 5};list<int>::reverse_iterator rit = l1.rbegin();while (rit != l1.rend()) {cout << *rit << " ";rit++;}

4、list带参数构造

list(n,elem) //构造函数,创建n个值为elem的元素
list(begin, end); //构造函数,使用区间[begin, end)的元素构造list
list(const list &lst); //拷贝构造函数

注意:list(begin, end) 不支持迭代器 + n的操作

  list<int> l2(l1.begin()+ 1, l2.end()); //error
//list(begin, end)
int main()
{list<int> l1;l1.push_back(1);l1.push_back(2);l1.push_back(3);l1.push_back(4);list<int>::iterator beg = l1.begin();list<int>::iterator end = l1.begin();beg++;  end++;end++;end++;list<int> l2(beg, end);     //此处为左闭右开区间list<int>::iterator it2;for(it2 = l2.begin(); it2 != l2.end(); it2++){cout << *it2 << " ";}cout << endl;return 0;
}
list<int> l1(5, 10); //创建5个值为10的元素
list<int> l2(l1.begin(), l1.end()); //使用l1的元素构造l2
list<int> l3(l2); //使用l2构造l3

5、list赋值

list.assign(beg, end); //将[begin, end)区间中的元素赋值给list
list.assign(n, elem); //将n个elem的元素赋值给list
list &operator=(const list &lst); //重载等号操作符
list.swap(lst); //将lst与当前的list交换

list<int> l1;list<int>::iterator it;l1.assign(3, 10); //将l1中的元素初始化为10个3list<int> l2;l2.assign(l1.begin(), l1.end()); //将l1中的元素赋值给l2list<int>::iterator it2 = l1.end();it2--;for(it = l1.begin(); it != it2; it++){cout << *it << " ";}l1.assign(4,1);     //assign函数不是追加,而是重新赋值l1.swap(l2); //交换l1和l2的元素

6、list大小操作

list.size(); //返回list中元素的个数
list.empty(); //判断list是否为空
list.resize(num); //重新指定list的大小,如果num大于当前list的大小,则插入默认值;如果num小于当前list的大小,则删除后面的元素
list.resize(num, elem); //重新指定list的大小,并填充默认值
,如果num大于当前list的大小,则插入elem;如果num小于当前list的大小,则删除后面的元素

int main()
{list<int> l1;list<int>::iterator it;l1.assign(3, 10);int len = l1.size();for(it = l1.begin(); it != l1.end(); it++)cout << *it << " ";     //10 10 10l1.resize(5);       for(it = l1.begin(); it != l1.end(); it++)cout << *it << " ";     //10 10 10 0 0return 0;
}

7、list的插入

插入不会使list的迭代器失效。

list.insert(pos, elem); //在pos位置插入elem元素,返回新元素的迭代器
list.insert(pos, n, elem); //在pos位置插入n个elem元素
list.insert(pos, beg, end); //在pos位置插入[beg, end)区间的元素

8、list的删除

删除可能会使list的迭代器失效。

list.pop_front(); //删除第一个元素
list.pop_back(); //删除最后一个元素
list.erase(pos); //删除pos位置的元素,返回下一个元素的迭代器
list.erase(beg, end); //删除[beg, end)区间的元素,返回下一个元素的迭代器
list.remove(elem); //删除所有与elem值匹配的元素
list.clear(); //删除所有元素

int main()
{list<int> l1;list<int>::iterator it = l1.begin();l1.push_back(1);l1.push_back(25);l1.push_back(39);l1.push_back(47);list<int>::iterator it1 = l1.begin();for(it = l1.begin(); it != l1.end(); it++){cout<< *it << " ";}cout << endl;it  = l1.erase(it1);        //删除单一元素,返回的是被删除元素的下一个元素的迭代器cout << *it << endl;            // 25 
}
//删除某一区间的元素list<int>::iterator it1 = l1.begin();list<int>::iterator it2 = l1.begin();it2++;it2++;l1.erase(it1, it2);     //删除第一个和第二个元素for(it = l1.begin(); it != l1.end(); it++){cout<< *it << " ";}
//删除所有的30
int main()
{list<int> l1;list<int>::iterator it = l1.begin();l1.push_back(30);l1.push_back(25);l1.push_back(30);l1.push_back(30);l1.push_back(47);l1.push_back(30);for(it = l1.begin(); it != l1.end(); it++){cout<< *it << " ";}cout << endl;l1.remove(30);          //删除所有的30for(it = l1.begin(); it != l1.end(); it++){cout<< *it << " ";}return 0;
}

9、list的排序

list.sort(); //对list中的元素进行排序
list.reverse(); //反转链表
list.unique(); //删除相邻重复的元素,只保留一个。


//unique()
int main()
{list<int> l1;list<int>::iterator it = l1.begin();l1.push_back(30);l1.push_back(30);l1.push_back(25);l1.push_back(30);l1.push_back(30);l1.push_back(30);l1.push_back(47);l1.push_back(30);for(it = l1.begin(); it != l1.end(); it++){cout<< *it << " ";          // 30 30   25   30 30 30   47 30}cout << endl;l1.unique();for(it = l1.begin(); it != l1.end(); it++){cout<< *it << " ";         //30    25    30   47 30}
}

10、list迭代器失效

在删除元素时,迭代器会失效,不能继续使用,否则会报错。

int main()
{list<int> l1;list<int>::iterator it = l1.begin();l1.push_back(30);l1.push_back(30);l1.push_back(25);l1.push_back(30);l1.push_back(30);l1.push_back(30);l1.push_back(47);l1.push_back(30);l1.push_back(30);//迭代器失效的情况for (it = l1.begin(); it != l1.end();){if(*it == 30){l1.erase(it);           //正确做法:it = l1.erase(it); 删除元素后,使it指向下一个元素}else{it++;}}for(it = l1.begin(); it != l1.end(); it++){cout << *it << " ";}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/860457.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java三阶段总结(家用电路模拟)

前言第六次题目集知识点:抽象类,抽象类不能被直接实例化!有抽象方法,抽象方法没有方法体,由继承它的子类提供具体实现。抽象类可以看作是一种模板,子类在实现接口方法时,必须实现接口中的所有抽象方法,除非子类也是抽象类在抽象类和接口中,多态体现为父类引用变量可以…

Material Design风格纯js确认框和对话框插件

material-modal是一款Material Design风格纯js确认框和对话框插件。该插件通过简单的CSS和JavaScript代码来构建确认框和对话框,是替代浏览器原生确认框和对话框的不错选择。在线预览 下载使用方法 在页面中引入material-modal.css和material-modal.js文件。< link rel=&…

PTA家居电路模拟3到家居模拟电路4

目录 一、答题判题程序第四次迭代 1、题目分析 2、题目类图 3、题目时序图 4、题目思路 二、家居强电电路模拟程序第一次迭代 1、题目分析 2、题目类图 3、题目时序图 4、题目思路 三、家居强电电路模拟程序第二次迭代 1、题目分析 2、题目类图 3、题目时序图 4、题目思路 四、…

Java难绷知识01——IO流的对象流

Java难绷知识01之对象流 本篇文章会探讨一些JavaIO流中比较容易被忽视的对象流,而且会相对的探讨其中的一些细节 其中对于对象流的操作讲解会少一些,主要讨论的是一些细节 在 Java IO 流中,对象流(ObjectInputStream对象输入流 和 ObjectOutputStream对象输出流)用于将对象…

题目集7-8总结

前言题目集的知识点、题量、难度 1.知识点总结:类的定义与实例化: 概念:定义类的属性和方法,创建对象 示例:public class Device { private String id; } 应用:定义各种电气设备类并创建实例继承关系: 概念:子类继承父类特征 示例:class Switch extends Device 应用:所…

Rust和C/C++相关调用总结

一.Windows下Rust与C/C++互相调用 1.C/C++调用rust 1.1动态库调用 1.1.1以LoadLibrary方式显示调用 add.rs #[no_mangle] // 防止 Rust 修改函数名 pub extern "C" fn hello_world() {println!("Hello from Rust!"); }#[no_mangle] pub extern "C&quo…

24.11.20 磁盘管理

磁盘外部结构 磁盘分类:固态硬盘:内部是主板和U盘类似机械硬盘:盘片 主轴 传动手臂 做机械运动 类似DVDNvme硬盘 PCI-E接口大小分类:3.5英寸:台式机2.5英寸:服务器 笔记本接口类型:IDE接口 # 淘汰SCSI接口 # 淘汰SATA接口 # 台式机 笔记本SAS接口 # 企业服务器标配固…

Julia疑难杂症专栏 | 安装问题汇总及其解决方案,从环境配置到结果验证,深度学习、科学计算、数据处理、大模型、并行处理,让你的代码飞起来

1. 下载慢的问题 使用端口问题 2. 下载慢的问题 ,设置镜像源加快速度 3. 一般的安装问题 4. STATA+julia 5. Vscode+julia 6. Jupyter+julia 7. Julia引入PyCall或者PyPlot报错卡顿 8. 彻底删除包的方法 9. Pkg.add("某个包")出现权限问题 permission denied (EACCE…

再战博客园美化(六)

连续剧更新了佬提了一嘴,于是我发现我替换没替换完,现在好了。 这是什么bug明明存在forFlow,但是不让我查询? 弄错了,用.就好light dark回来了,vue没有检查我默认有没有赋值,他只会自己贴一个上去。 算了,那就用vue的切换!不会吧。 在call后出现已被定义,有问题。被重…

arping 工具使用

1. 项目介绍arping 是一个用于在局域网(LAN)中查找特定 IP 地址是否被占用的实用工具。与传统的 ping 命令不同,arping 使用 ARP 协议来发送和接收数据包,从而能够检测到那些阻止 ICMP 请求的主机。arping 可以帮助网络管理员在调试网络时,快速确定哪些 IP 地址已经被占用…

Rules Of JSX 渲染列表 ‼️State

JSX只能拥有一个root元素,即只能有一个父元素。React不会渲染true或false到界面上,但会渲染0,1。 isOpen && <p>Hello!</p> 上述短路表达式意为:只有当isOpen为真时,才会执行第二部分内容,返回第二部分内容。如果isOpen为假且它的值为0,表达式会返回…

FastStone Capture10.9电脑截图工具中文绿色便携版

前言 FSCapture是一款集图像捕捉、浏览编辑、视频录制等功能于一身的屏幕截图软件,软件具有体积小巧、功能强大、操作简便等优点,其方便的浮动工具条和便捷的快捷键堪称完美结合。截图后的图片编辑与保存选项也特别丰富和方便,内置功能完善的图像编辑器,支持几乎所有主流图…