C++SLT(五)——list
目录
- 一、list的介绍
- 二、list的使用
- list的定义方式
- 三、list的插入和删除
- push_back和pop_back
- push_front和pop_front
- insert
- erase
- 四、list的迭代器使用
- 五、list的元素获取
- 六、list的大小控制
- 七、list的操作函数
- sort和reverse
- merge
- remove
- remove_if
- unique
- assign
- swap
一、list的介绍
- list是一种可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
- list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立结点当中,在结点中通过指针指向其前一个元素和后一个元素。
- list与forward_list非常相似,最主要的不同在于forward_list是单链表,只能进行单方向迭代。
与其他容器相比,list通常在任意位置进行插入、删除元素的执行效率更高。 - list和forward_list最大的缺陷是不支持在任意位置的随机访问,其次,list还需要一些额外的空间,以保存每个结点之间的关联信息(对于存储的类型较小元素来说这可能是一个重要的因素)。
二、list的使用
list的定义方式
| 构造函数 | 接口说明 |
|---|---|
| list() | 构造空的list |
| list (size_type n, const value_type& val = value_type()) | 构造的list中包含n个值为val的元素 |
| list (const list& x) | 拷贝构造函数 |
| list (InputIterator first, InputIterator last) | 用[first, last)区间中的元素构造list |
void test_list()
{//构造int类型的空容器list<int> lt1; // 构造一个含有n个val的某类型容器list<int> lt2(5, 2);//拷贝构造某类型容器list<int> lt3(lt2);//使用迭代器拷贝构造某一段内容string str("hello world");list<char> lt4(str.begin(), str.end()); //构造string对象某段区间的复制品//构造数组某段区间的复制品int arr[] = { 1, 2, 3, 4, 5 };list<int> lt5(arr, arr + sizeof(arr) / sizeof(int));
}
三、list的插入和删除
| 函数声明 | 接口说明 |
|---|---|
| push_back | 在list尾部插入值为val的元素 |
| pop_back | 删除list中最后一个元素 |
| push_front | 在list首元素前插入值为val的元素 |
| pop_front | 删除list中第一个元素 |
| insert | 在list position 位置中插入值为val的元素 |
| erase | 删除list position位置的元素 |
push_back和pop_back
void test1_list()
{//push_back()和pop_back(),两种循环都可以list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);auto it = lt.begin();while (it != lt.end()){cout << *it << " "; //1 2 3 4++it;}cout << endl;lt.pop_back();lt.pop_back();for (auto e : lt){cout << e << " "; //1 2}cout << endl;
}
push_front和pop_front
void test2_list()
{//push_front和pop_front,通常用范围for方便一点list<int> lt1;lt1.push_front(1);lt1.push_front(2);lt1.push_front(3);for (auto e : lt1){cout << e << " "; //3 2 1}cout << endl;lt1.pop_front();for (auto e : lt1){cout << e << " "; //2 1}cout << endl;
}
insert
- 在指定迭代器位置插入一个数。
- 在指定迭代器位置插入n个值为val的数。
- 在指定迭代器位置插入一段迭代器区间(左闭右开)。
void test3_list()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);//5前插入17//v.insert(v.begin() + 5, 17); //顺序表的话迭代器开头+5就可以插入auto it = lt.begin(); //链表,1.类似指针指到5前,2.插入for (size_t i = 0; i < 5; i++) {++it;}lt.insert(it,17); for (auto e : lt){cout << e << " "; //1 2 3 4 5 17}cout << endl;//在指定的数前插入,例如在4前插入100,使用find找到该数it = find(lt.begin(), lt.end(), 4);if (it != lt.end()){lt.insert(it, 100);}for (auto e : lt){cout << e << " "; //1 2 3 100 4 5 17}cout << endl;
}
find函数是头文件“algorithm”当中的一个函数,该函数在指定迭代器区间(左闭右开)寻找指定值的位置,并返回该位置的迭代器。
template<class InputIterator, class T>InputIterator find (InputIterator first, InputIterator last, const T& val)
{while (first!=last) {if (*first==val) return first;++first;}return last;
}
erase
list当中的erase函数支持两种删除方式:
- 删除指定迭代器位置的元素。
- 删除指定迭代器区间(左闭右开)的所有元素。
void test4_list()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);lt.push_back(6);lt.push_back(7);auto it = find(lt.begin(), lt.end(), 3);lt.erase(it); //删除3for (auto e : lt){cout << e << " "; //1 2 4 5 6 7}cout << endl;it = find(lt.begin(), lt.end(), 5);lt.erase(it, lt.end()); //删除5后所有元素(左闭右开)for (auto e : lt){cout << e << " "; //1 2 4}cout << endl;
}
四、list的迭代器使用
| 函数声明 | 接口说明 |
|---|---|
| begin + end | 返回第一个元素的迭代器+返回最后一个有效元素下一个位置的迭代器 |
| rbegin + rend | 返回第一个元素的reverse_iterator,即end位置,返回最后一个有效元素下一个位置的reverse_iterator,即begin位置 |
void test5_list()
{//正向迭代器遍历容器list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);//list<int>::iterator it = lt.begin();auto it = lt.begin();while (it != lt.end()){cout << *it << " "; //1 2 3 4++it;}cout << endl;//反向迭代器遍历容器list<int> lt1;lt1.push_back(1);lt1.push_back(2);lt1.push_back(3);lt1.push_back(4);auto rit = lt1.rbegin();while (rit != lt1.rend()){cout << *rit << " "; //4 3 2 1++rit;}cout << endl;
}
五、list的元素获取
| 函数声明 | 接口说明 |
|---|---|
| front | 返回list的第一个节点中值的引用 |
| back | 返回list的最后一个节点中值的引用 |
void test6_list()
{list<int> lt;lt.push_back(0);lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);cout << lt.front() << endl; //0cout << lt.back() << endl; //4
}
六、list的大小控制
| 函数声明 | 接口说明 |
|---|---|
| size | 返回list中有效节点的个 |
| resize | 1.当所给值大于当前的size时,将size扩大到该值,扩大的数据为第二个所给值,若未给出,则默认为容器所存储类型的默认构造函数所构造出来的值。2.当所给值小于当前的size时,将size缩小到该值。 |
| empty | 检测list是否为空,是返回true,否则返回false |
| clear | 清空list中的有效元素 |
void test7_list()
{//size获取当前容器当中的元素个数list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);cout << lt.size() << endl; //4//resize扩容(可赋值)或缩容list<int> lt1(5, 2);for (auto e : lt1){cout << e << " "; //2 2 2 2 2}cout << endl;lt1.resize(8, 5); //将size扩大为8,扩大的值为5for (auto e : lt1){cout << e << " "; //2 2 2 2 2 5 5 5}cout << endl;lt1.resize(3); //将size缩小为3for (auto e : lt1){cout << e << " "; //2 2 2}cout << endl;//empty判断是否为空,没元素返回1,有元素返回0list<int> lt2;cout << lt2.empty() << endl; //1cout << lt1.empty() << endl; //0//clear清空容器(size元素)list<int> lt4(5, 2);for (auto e : lt4){cout << e << " "; //2 2 2 2 2}cout << endl; cout << lt4.size() << endl; //5lt.clear(); //清空容器for (auto e : lt){cout << e << " "; //(无数据)}cout << endl; cout << lt.size() << endl; //0
}
七、list的操作函数
| 函数声明 | 接口说明 |
|---|---|
| sort | 将容器当中的数据默认排为升序 |
| reverse | 将容器当中元素的位置进行逆置 |
| splice | 用于两个list容器之间的拼接 |
| remove | 用于删除容器当中特定值的元素 |
| remove_if | 用于删除容器当中满足条件的元素 |
| unique | 用于删除容器当中连续的重复元素 |
| merge | 将一个有序list容器合并到另一个有序list容器当中,使得合并后的list容器任然有序。(类似于归并排序) |
| assign | 将新内容分配给容器,替换其当前内容 |
| swap | 交换两个容器的内容 |
sort和reverse
void test8_list()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(10);lt.push_back(20);for (auto e : lt){cout << e << " "; //1 2 3 4 10 20}cout << endl;lt.reverse();for (auto e : lt){cout << e << " "; //20 10 4 3 2 1}cout << endl;
}
merge
merge函数用于将一个有序list容器合并到另一个有序list容器当中,使得合并后的list容器任然有序。(类似于归并排序)
void test10_list()
{list<int> lt;lt.push_back(17);lt.push_back(55);lt.push_back(32);list<int> lt1;lt1.push_back(11);lt1.push_back(3);lt1.push_back(100);lt.sort();lt1.sort();lt.merge(lt1); //将lt1合并到ltfor (auto e : lt){cout << e << " "; //3 11 17 32 55 100}cout << endl;
}
remove
remove函数用于删除容器当中特定值的元素。
void test9_list()
{int arr[] = { 12,65,32,11,22,11,3 };list<int> mylist(arr, arr + sizeof(arr) / sizeof(int));mylist.remove(11);for (auto e : mylist){cout << e << " "; //12 65 32 22 3}cout << endl;
}
remove_if
remove_if函数用于删除容器当中满足条件的元素
bool single_digit(const int& val)
{return val < 10;
}
void test11_list()
{list<int> lt;lt.push_back(3);lt.push_back(2);lt.push_back(65);lt.push_back(33);lt.push_back(9);lt.push_back(5);lt.push_back(4);for (auto e : lt){cout << e << " ";}cout << endl; //3 2 65 33 9 5 4lt.remove_if(single_digit); //删除容器当中值小于10的元素for (auto e : lt){cout << e << " ";}cout << endl; //65 33
}
unique
unique函数用于删除容器当中连续的重复元素。
void test12_list()
{list<int> lt;lt.push_back(2);lt.push_back(3);lt.push_back(3);lt.push_back(2);lt.push_back(1);lt.push_back(3);lt.push_back(3);for (auto e : lt){cout << e << " ";}cout << endl; //2 3 3 2 1 3 3lt.sort(); lt.unique(); //删除容器当中连续的重复元素for (auto e : lt){cout << e << " ";}cout << endl; //1 2 3
}
assign
assign函数用于将新内容分配给容器,替换其当前内容,新内容的赋予方式有两种:
- 将n个值为val的数据分配给容器。
- 将所给迭代器区间当中的内容分配给容器。
void test13_list()
{list<char> lt(3, 's');lt.assign(4, 'a'); //将新内容分配给容器,替换其当前内容for (auto e : lt){cout << e << " "; //a a a a}cout << endl;string str("hello word");lt.assign(str.begin(), str.end()); //将新内容分配给容器,替换其当前内容for (auto e : lt){cout << e << " "; //h e l l o w o r d}cout << endl;
}
swap
void test14_list()
{list<int> lt1(5, 2);list<int> lt2(2, 6);lt1.swap(lt2); //交换两个容器的内容for (auto e : lt1){cout << e << " ";}cout << endl; //6 6for (auto e : lt2){cout << e << " ";}cout << endl; //2 2 2 2 2
}
相关文章:
C++SLT(五)——list
目录 一、list的介绍二、list的使用list的定义方式 三、list的插入和删除push_back和pop_backpush_front和pop_frontinserterase 四、list的迭代器使用五、list的元素获取六、list的大小控制七、list的操作函数sort和reversemergeremoveremove_ifuniqueassignswap 一、list的介…...
网络安全ITP是什么 网络安全产品ips
DS/IPS都是专门针对计算机病毒和黑客入侵而设计的网络安全设备 1、含义不同 IDS :入侵检测系统(发现非法入侵只能报警不能自己过滤) 做一个形象的比喻:假如防火墙是一幢大楼的门锁,那么IDS就是这幢大楼里的监视系统…...
评估大模型(LLM)摘要生成能力:方法、挑战与策略
大语言模型(LLMs)有着强大的摘要生成能力,为信息快速提取和处理提供了便利。从新闻文章的快速概览到学术文献的要点提炼,LLMs 生成的摘要广泛应用于各个场景。然而,准确评估这些摘要的质量却颇具挑战。如何确定一个摘要…...
《PYTHON语言程序设计》(2018版)1.20修改这道题,利用类的方式(二) 接近成功....(上)
在类的外面建立4个顶点 turtle.speed(20)ran1_x1 random.randint(-69, -60) ran1_y1 random.randint(-5, 10) ran1_x2 random.randint(-69, -60) ran1_y2 random.randint(75, 80) ran1_x3 random.randint(79, 90) ran1_y3 random.randint(70, 85) ran1_x4 random.randin…...
USB子系统学习(四)使用libusb读取鼠标数据
文章目录 1、声明2、HID协议2.1、描述符2.2、鼠标数据格式 3、应用程序4、编译应用程序5、测试 1、声明 本文是在学习韦东山《驱动大全》USB子系统时,为梳理知识点和自己回看而记录,全部内容高度复制粘贴。 韦老师的《驱动大全》:商品详情 …...
【产品小白】用户调研的需求是否都采纳?
在用户调研中,并非所有需求都应被直接采纳,而应通过系统分析转化为符合产品战略的有效决策。以下是关键思考框架: 1. 用户需求 ≠ 产品需求 矛盾性:用户个体需求可能相互冲突(如A功能的去留),需…...
软件测试就业
文章目录 2.6 初识一、软件测试理论二、软件的生产过程三、软件测试概述四、软件测试目的五、软件开发与软件测试的区别?六、学习内容 2.7 理解一、软件测试的定义二、软件测试的生命周期三、软件测试的原则四、软件测试分类五、软件的开发与测试模型1.软件开发模型…...
qt部分核心机制
作业 1> 手动将登录项目实现,不要使用拖拽编程 并且,当点击登录按钮时,后台会判断账号和密码是否相等,如果相等给出登录成功的提示,并且关闭当前界面,发射一个跳转信号,如果登录失败&#…...
【RocketMQ】RocketMq之ConsumeQueue深入研究
目录 一:RocketMq 整体文件存储介绍 二:ConsumeQueue 的文件结构 三:ConsumeQueue 写入和查询流程 一:RocketMq 整体文件存储介绍 存储⽂件主要分为三个部分: CommitLog:存储消息的元数据。所有消息都会…...
如今物联网的快速发展对hmi的更新有哪些积极影响
一、功能更加丰富 物联网的快速发展使得 HMI(人机界面)能够连接更多的设备和系统,从而实现更加丰富的功能。例如,通过与传感器网络的连接,HMI 可以实时显示设备的运行状态、环境参数等信息,为用户提供更加…...
linux 性能60秒分析
linux 60秒分析 需要运行的工具是 1、uptime 2、dmesg | tail 3、vmstat 1 4、mpstat -P ALL 1 5、pidstat 1 6、iostat -xz 1 7、free -m 8、sar -n DEV 1 9、sar -n TCP,ETCP 1 10、topuptime 快速检查平均负载 [rootaaaaaa ~]# uptime15:17:20 up 3 days, 14 min, 7 us…...
Redisson全面解析:从使用方法到工作原理的深度探索
文章目录 写在文章开头详解Redisson基本数据类型基础配置字符串操作列表操作映射集阻塞队列延迟队列更多关于Redisson详解Redisson 中的原子类详解redisson中的发布订阅模型小结参考写在文章开头 Redisson是基于原生redis操作指令上进一步的封装,屏蔽了redis数据结构的实现细…...
neo4j-解决导入数据后出现:Database ‘xxxx‘ is unavailable. Run :sysinfo for more info.
目录 问题描述 解决方法 重新导入 问题描述 最近在linux上部署了neo4j,参照之前写的博客:neo4j-数据的导出和导入_neo4j数据导入导出-CSDN博客 进行了数据导出、导入操作。但是在进行导入后,重新登录网页版neo4j,发现对应的数据库状态变…...
51单片机之引脚图(详解)
8051单片机引脚分类与功能笔记 1. 电源引脚 VCC(第40脚):接入5V电源,为单片机提供工作电压。GND(第20脚):接地端,确保电路的电位参考点。 2.时钟引脚 XTAL1(第19脚&a…...
Hangfire.NET:.NET任务调度
引言:为何选择 Hangfire? 在开发.NET 应用程序时,我们常常会遇到这样的场景:应用程序需要定期发送报告,像财务报表,每日业务数据汇总报告等,这些报告需要定时生成并发送给相关人员;…...
深入解析:React 事件处理的秘密与高效实践
在 React 中,事件处理是构建交互式应用的核心。本文将带你深入探索 React 事件处理的机制、最佳实践以及如何避免常见陷阱,助你写出更高效、更健壮的代码。 1. React 事件处理的独特之处 合成事件(SyntheticEvent) React 使用合…...
开源像素字体,可用于独立游戏开发
方舟像素字体 / Ark Pixel Font 开源的泛中日韩像素字体,使用 SIL 开放字体许可证 第1.1版(SIL Open Font License 1.1)授权。 支持 10、12 和 16 像素尺寸。 支持语言特殊字形:中文-中国大陆、中文-香港特别行政区、中文-台湾…...
【论文阅读】Comment on the Security of “VOSA“
Comment on the Security of Verifiable and Oblivious Secure Aggregation for Privacy-Preserving Federated Learning -- 关于隐私保护联邦中可验证与遗忘的安全聚合的安全性 论文来源摘要Introduction回顾 VOSA 方案对VOSA不可伪造性的攻击对于类型 I 的攻击对于类型 II 的…...
了解传输层TCP协议
目录 一、TCP协议段格式 二、TCP原理 1.确认应答 2.超时重传 3.连接管理 建立连接 断开连接 4.滑动窗口 5.流量控制 6.拥塞控制 7.延时应答 8.捎带应答 9.面向字节流 10.TCP异常情况 TCP,即Transmission Control Protocol,传输控制协议。人如…...
flask实现用户名查重,重复的用户名阻止注册,以及如何优化
在 Flask 中实现用户名查重,并阻止重复的用户名进行注册,可以使用数据库(如 SQLite、MySQL、PostgreSQL)存储用户信息,并在注册时检查用户名是否已存在。以下是实现步骤: 1. 安装 Flask 及 SQLAlchemy 确保…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
