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

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的介绍

  1. list是一种可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
  2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立结点当中,在结点中通过指针指向其前一个元素和后一个元素。
  3. list与forward_list非常相似,最主要的不同在于forward_list是单链表,只能进行单方向迭代。
    与其他容器相比,list通常在任意位置进行插入、删除元素的执行效率更高。
  4. 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

  1. 在指定迭代器位置插入一个数。
  2. 在指定迭代器位置插入n个值为val的数。
  3. 在指定迭代器位置插入一段迭代器区间(左闭右开)。
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函数支持两种删除方式:

  1. 删除指定迭代器位置的元素。
  2. 删除指定迭代器区间(左闭右开)的所有元素。
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中有效节点的个
resize1.当所给值大于当前的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函数用于将新内容分配给容器,替换其当前内容,新内容的赋予方式有两种:

  1. 将n个值为val的数据分配给容器。
  2. 将所给迭代器区间当中的内容分配给容器。
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 &#xff1a;入侵检测系统&#xff08;发现非法入侵只能报警不能自己过滤&#xff09; 做一个形象的比喻&#xff1a;假如防火墙是一幢大楼的门锁&#xff0c;那么IDS就是这幢大楼里的监视系统…...

评估大模型(LLM)摘要生成能力:方法、挑战与策略

大语言模型&#xff08;LLMs&#xff09;有着强大的摘要生成能力&#xff0c;为信息快速提取和处理提供了便利。从新闻文章的快速概览到学术文献的要点提炼&#xff0c;LLMs 生成的摘要广泛应用于各个场景。然而&#xff0c;准确评估这些摘要的质量却颇具挑战。如何确定一个摘要…...

《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子系统时&#xff0c;为梳理知识点和自己回看而记录&#xff0c;全部内容高度复制粘贴。 韦老师的《驱动大全》&#xff1a;商品详情 …...

【产品小白】用户调研的需求是否都采纳?

在用户调研中&#xff0c;并非所有需求都应被直接采纳&#xff0c;而应通过系统分析转化为符合产品战略的有效决策。以下是关键思考框架&#xff1a; 1. 用户需求 ≠ 产品需求 矛盾性&#xff1a;用户个体需求可能相互冲突&#xff08;如A功能的去留&#xff09;&#xff0c;需…...

软件测试就业

文章目录 2.6 初识一、软件测试理论二、软件的生产过程三、软件测试概述四、软件测试目的五、软件开发与软件测试的区别&#xff1f;六、学习内容 2.7 理解一、软件测试的定义二、软件测试的生命周期三、软件测试的原则四、软件测试分类五、软件的开发与测试模型1.软件开发模型…...

qt部分核心机制

作业 1> 手动将登录项目实现&#xff0c;不要使用拖拽编程 并且&#xff0c;当点击登录按钮时&#xff0c;后台会判断账号和密码是否相等&#xff0c;如果相等给出登录成功的提示&#xff0c;并且关闭当前界面&#xff0c;发射一个跳转信号&#xff0c;如果登录失败&#…...

【RocketMQ】RocketMq之ConsumeQueue深入研究

目录 一&#xff1a;RocketMq 整体文件存储介绍 二&#xff1a;ConsumeQueue 的文件结构 三&#xff1a;ConsumeQueue 写入和查询流程 一&#xff1a;RocketMq 整体文件存储介绍 存储⽂件主要分为三个部分&#xff1a; CommitLog&#xff1a;存储消息的元数据。所有消息都会…...

如今物联网的快速发展对hmi的更新有哪些积极影响

一、功能更加丰富 物联网的快速发展使得 HMI&#xff08;人机界面&#xff09;能够连接更多的设备和系统&#xff0c;从而实现更加丰富的功能。例如&#xff0c;通过与传感器网络的连接&#xff0c;HMI 可以实时显示设备的运行状态、环境参数等信息&#xff0c;为用户提供更加…...

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&#xff0c;参照之前写的博客:neo4j-数据的导出和导入_neo4j数据导入导出-CSDN博客 进行了数据导出、导入操作。但是在进行导入后&#xff0c;重新登录网页版neo4j&#xff0c;发现对应的数据库状态变…...

51单片机之引脚图(详解)

8051单片机引脚分类与功能笔记 1. 电源引脚 VCC&#xff08;第40脚&#xff09;&#xff1a;接入5V电源&#xff0c;为单片机提供工作电压。GND&#xff08;第20脚&#xff09;&#xff1a;接地端&#xff0c;确保电路的电位参考点。 2.时钟引脚 XTAL1&#xff08;第19脚&a…...

Hangfire.NET:.NET任务调度

引言&#xff1a;为何选择 Hangfire&#xff1f; 在开发.NET 应用程序时&#xff0c;我们常常会遇到这样的场景&#xff1a;应用程序需要定期发送报告&#xff0c;像财务报表&#xff0c;每日业务数据汇总报告等&#xff0c;这些报告需要定时生成并发送给相关人员&#xff1b;…...

深入解析:React 事件处理的秘密与高效实践

在 React 中&#xff0c;事件处理是构建交互式应用的核心。本文将带你深入探索 React 事件处理的机制、最佳实践以及如何避免常见陷阱&#xff0c;助你写出更高效、更健壮的代码。 1. React 事件处理的独特之处 合成事件&#xff08;SyntheticEvent&#xff09; React 使用合…...

开源像素字体,可用于独立游戏开发

方舟像素字体 / Ark Pixel Font 开源的泛中日韩像素字体&#xff0c;使用 SIL 开放字体许可证 第1.1版&#xff08;SIL Open Font License 1.1&#xff09;授权。 支持 10、12 和 16 像素尺寸。 支持语言特殊字形&#xff1a;中文-中国大陆、中文-香港特别行政区、中文-台湾…...

【论文阅读】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&#xff0c;即Transmission Control Protocol&#xff0c;传输控制协议。人如…...

flask实现用户名查重,重复的用户名阻止注册,以及如何优化

在 Flask 中实现用户名查重&#xff0c;并阻止重复的用户名进行注册&#xff0c;可以使用数据库&#xff08;如 SQLite、MySQL、PostgreSQL&#xff09;存储用户信息&#xff0c;并在注册时检查用户名是否已存在。以下是实现步骤&#xff1a; 1. 安装 Flask 及 SQLAlchemy 确保…...

为什么 Promise 比 setTimeout 先执行?——JavaScript 事件循环与异步顺序完全指南

为什么 Promise 比 setTimeout 先执行&#xff1f;——JavaScript 事件循环与异步顺序完全指南 这是 JavaScript 异步中最经典也最容易困惑的问题之一。核心答案是&#xff1a; Promise 的回调属于 Microtask&#xff08;微任务&#xff09;&#xff0c;setTimeout 属于 Macro…...

告别“检测即损伤”:激光加工重塑电路检测与修复新路径

随着芯片互联兴起&#xff0c;电路结构日趋复杂&#xff0c;隐性缺陷对良率的威胁显著增加。如何在不破坏电路的前提下发现短路、断路等问题并对其进行精准处置&#xff0c;是半导体集成电路领域提升器件性能与良率的首要任务。在这一需求驱动下&#xff0c;激光技术凭借其特性…...

从电视伴音收音机消亡看数字技术演进与仪器集成化趋势

1. 从一台“电视伴音收音机”说起&#xff1a;一个时代的消逝与技术演进的注脚我书桌抽屉的角落里&#xff0c;一直躺着一台老旧的收音机。它不是普通的AM/FM收音机&#xff0c;在它的波段选择旋钮上&#xff0c;除了熟悉的“AM”和“FM”&#xff0c;还有一个略显神秘的“TV”…...

不删除属性的情况下简化对象属性的方法探讨

是否还有其他方法可以简化从对象中删除特定属性的操作。舍友提出了一个对象属性简化的问题&#xff0c;询问在不删除属性的情况下&#xff0c;如何简化从对象中删除特定属性的操作。02解决方案最初&#xff0c;我曾考虑过不直接删除属性&#xff0c;而是仅保留业务所需的那些。…...

Harbor:统一管理MCP服务器,告别AI助手配置混乱

1. 项目概述&#xff1a;Harbor&#xff0c;一个管理MCP服务器的统一中心如果你和我一样&#xff0c;在日常开发中深度依赖Claude、Cursor这类AI编程助手&#xff0c;那你一定对MCP&#xff08;Model Context Protocol&#xff09;服务器不陌生。简单来说&#xff0c;MCP服务器…...

FastAPI清洁架构实践:从分层设计到可维护项目搭建

1. 项目概述&#xff1a;一个为FastAPI项目设立的“洁净室”当你开始一个新的FastAPI项目时&#xff0c;面对的是一个空白的画布。理论上&#xff0c;你可以自由地绘制任何架构&#xff0c;但现实往往是&#xff1a;随着第一个路由、第一个数据库模型、第一个业务逻辑的加入&am…...

【统计推断实战】从置信区间到假设检验:如何用数据做出可靠决策

1. 从产品迭代案例看统计推断的价值 最近团队上线了一个新功能&#xff0c;产品经理信心满满地宣称能提升15%的用户留存率。但上线一周后数据波动很大&#xff0c;有人觉得效果明显&#xff0c;有人却说毫无变化。这时候该信谁的&#xff1f;其实这就是统计推断大显身手的时刻—…...

如何永久保存微信聊天记录:WeChatMsg完整指南与数据安全终极方案

如何永久保存微信聊天记录&#xff1a;WeChatMsg完整指南与数据安全终极方案 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trendin…...

别再对着乱码发愁了!手把手教你用Python解码AIS VDM暗码(附完整代码)

从AIS暗码到可读数据&#xff1a;Python实战解析指南 当你第一次看到类似!AIVDM,1,1,,A,169DvlgP1R8KPtvFBfOCt3?h0RT,0*03这样的字符串时&#xff0c;可能会感到一头雾水。这串看似随机的字符实际上是AIS(船舶自动识别系统)传输的VDM(VHF Data-link Message)报文&#xff0c;…...

POTS与VoIP技术演进:从电路交换到分组交换的可靠性之争与实战指南

1. 项目概述&#xff1a;当技术演进遭遇“顽固”的用户体验作为一名在通信行业摸爬滚打了十几年的工程师&#xff0c;我最近读到一篇2015年的老文章&#xff0c;标题挺有意思&#xff0c;叫《给POTS&#xff08;普通老式电话服务&#xff09;的心脏钉上木桩&#xff1f;》。作者…...