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

09.list 容器

9、list 容器

功能:

  • 将数据进行链式存储

链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的

链表的组成:

  • 链表由一系列结点组成

结点的组成:

  • 一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域

STL中的链表是一个双向循环链表

1694782885909

由于链表的存储方式并不是连续的内存空间,因此链表 list 中的迭代器只支持前移和后移,属于双向迭代器

list 的优点:

  • 采用动态存储分配,不会造成内存浪费和溢出
  • 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素

list 的缺点:

  • 链表灵活,但是空间(指针域) 和 时间(遍历)额外耗费较大

List 有一个重要的性质,插入操作和删除操作都不会造成原有 list 迭代器的失效,这在 vector 是不成立的。

9.1 list 构造函数

功能描述:

  • 创建 list 容器

函数原型:

list<T> lst;   			// list 采用采用模板类实现,对象的默认构造形式:
list(beg,end); 			// 构造函数将 [beg, end) 区间中的元素拷贝给本身。
list(n,elem);  			// 构造函数将 n 个 elem 拷贝给本身。
list(const list &lst); 	// 拷贝构造函数。
#include <iostream>
#include <list>using namespace std;void printList(const list<int>& L) {for (list<int>::const_iterator it = L.begin(); it != L.end(); it++) {cout << *it << " ";}cout << endl;
}void test01()
{list<int>L1;L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);printList(L1);list<int>L2(L1.begin(), L1.end());printList(L2);list<int>L3(L2);printList(L3);list<int>L4(10, 1000);printList(L4);
}int main() {test01();system("pause");return 0;
}

9.2 list 赋值和交换

功能描述:

  • 给 list 容器进行赋值,以及交换 list 容器

函数原型:

assign(beg, end); 					// 将 [beg, end) 区间中的数据拷贝赋值给本身。
assign(n, elem);  					// 将 n 个 elem 拷贝赋值给本身。
list& operator=(const list &lst); 	// 重载等号操作符
swap(lst); 							//将 lst 与本身的元素互换。
#include <iostream>
#include <list>
using namespace std;void printList(const list<int>& L) {for (list<int>::const_iterator it = L.begin(); it != L.end(); it++) {cout << *it << " ";}cout << endl;
}
// 赋值和交换
void test01() {list<int>L1;L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);printList(L1);// 赋值list<int>L2;L2 = L1;printList(L2);list<int>L3;L3.assign(L2.begin(), L2.end());printList(L3);list<int>L4;L4.assign(10, 100);printList(L4);
}// 交换
void test02() {list<int>L1;L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);list<int>L2;L2.assign(10, 100);cout << "交换前: " << endl;printList(L1);printList(L2);cout << endl;L1.swap(L2);cout << "交换后: " << endl;printList(L1);printList(L2);
}int main() {//test01();test02();system("pause");return 0;
}

9.3 list 大小操作

功能描述:

  • 对 list 容器的大小进行操作

函数原型:

size(); 	// 返回容器中元素的个数
empty(); 	// 判断容器是否为空// 重新指定容器的长度为 num,若容器变长,则以默认值填充新位置。
// 如果容器变短,则末尾超出容器长度的元素被删除。
resize(num); // 重新指定容器的长度为 num,若容器变长,则以 elem 值填充新位置。
// 如果容器变短,则末尾超出容器长度的元素被删除。
resize(num, elem); 
#include <iostream>
#include <list>
using namespace std;void printList(const list<int>& L) {for (list<int>::const_iterator it = L.begin(); it != L.end(); it++) {cout << *it << " ";}cout << endl;
}
// 大小操作
void test01()
{list<int>L1;L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);if (L1.empty()){cout << "L1为空" << endl;}else{cout << "L1不为空" << endl;cout << "L1的大小为: " << L1.size() << endl;}// 重新指定大小L1.resize(10);printList(L1);L1.resize(2);printList(L1);
}
int main() {test01();system("pause");return 0;
}

总结:

  • 判断是否为空 — empty
  • 返回元素个数 — size
  • 重新指定个数 — resize

9.4 list 插入和删除

功能描述:

  • 对 list 容器进行数据的插入和删除

函数原型:

push_back(elem);		// 在容器尾部加入一个元素
pop_back();     		// 删除容器中最后一个元素
push_front(elem);		// 在容器开头插入一个元素
pop_front();    		// 从容器开头移除第一个元素
insert(pos,elem);		// 在 pos 位置插 elem 元素的拷贝,返回新数据的位置。
insert(pos,n,elem);		// 在 pos 位置插入 n 个 elem 数据,无返回值。
insert(pos,beg,end);	// 在 pos 位置插入 [beg,end) 区间的数据,无返回值。
clear();        		// 移除容器的所有数据
erase(beg,end); 		// 删除 [beg,end) 区间的数据,返回下一个数据的位置。
erase(pos);     		// 删除 pos 位置的数据,返回下一个数据的位置。
remove(elem);   		// 删除容器中所有与 elem 值匹配的元素。
#include <iostream>
#include <list>
using namespace std;void printList(const list<int>& L) {for (list<int>::const_iterator it = L.begin(); it != L.end(); it++) {cout << *it << " ";}cout << endl;
}
// 插入和删除
void test01() {list<int> L;// 尾插L.push_back(10);L.push_back(20);L.push_back(30);// 头插L.push_front(100);L.push_front(200);L.push_front(300);printList(L);// 尾删L.pop_back();printList(L);// 头删L.pop_front();printList(L);// 插入list<int>::iterator it = L.begin();L.insert(++it, 1000);printList(L);// 删除it = L.begin();L.erase(++it);printList(L);// 移除L.push_back(10000);L.push_back(10000);L.push_back(10000);printList(L);L.remove(10000);printList(L);// 清空L.clear();printList(L);
}
int main() {test01();system("pause");return 0;
}

总结:

  • 尾插 — push_back
  • 尾删 — pop_back
  • 头插 — push_front
  • 头删 — pop_front
  • 插入 — insert
  • 删除 — erase
  • 移除 — remove
  • 清空 — clear

9.5 list 数据存取

功能描述:

  • 对 list 容器中数据进行存取

函数原型:

front(); 			// 返回第一个元素。
back(); 			// 返回最后一个元素。
#include <iostream>
#include <list>
using namespace std;
//数据存取
void test01() {list<int>L1;L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);//cout << L1.at(0) << endl;	// 错误:不支持 at 访问数据//cout << L1[0] << endl; 	// 错误:不支持 [] 方式访问数据cout << "第一个元素为:" << L1.front() << endl;cout << "最后一个元素为:" << L1.back() << endl;// list容器的迭代器是双向迭代器,不支持随机访问list<int>::iterator it = L1.begin();//it = it + 1; 				// 错误:不可以跳跃访问,即使是+1
}int main() {test01();system("pause");return 0;
}

总结:

  • list 容器中不可以通过 [] 或者 at 方式访问数据
  • 返回第一个元素 — front
  • 返回最后一个元素 — back

9.6 list 反转和排序

功能描述:

  • 将容器中的元素反转,以及将容器中的数据进行排序

函数原型:

reverse(); 			// 反转链表
sort(); 			// 链表排序
#include <iostream>
#include <list>
using namespace std;void printList(const list<int>& L) {for (list<int>::const_iterator it = L.begin(); it != L.end(); ++it) {cout << *it << " ";}cout << endl;
}bool myCompare(int val1, int val2) {return val1 > val2;
}// 反转和排序
void test01() {list<int> L;L.push_back(90);L.push_back(30);L.push_back(20);L.push_back(70);printList(L);// 反转容器的元素L.reverse();printList(L);// 排序L.sort();printList(L);L.sort(myCompare);printList(L);
}
int main() {test01();system("pause");return 0;
}

总结:

  • 反转 — reverse
  • 排序 — sort (成员函数)

9.7 排序案例

案例描述:

  • 将 Person 自定义数据类型进行排序,Person 中属性有姓名、年龄、身高

排序规则:

  • 按照年龄进行升序,如果年龄相同按照身高进行降序
#include <iostream>
#include <list>
using namespace std;class Person {
public:Person(string name, int age, int height) {this->m_name = name;this->m_age = age;this->m_height = height;}
public:string m_name;int m_age;int m_height;
};bool Compareperson(Person& p1, Person& p2) {if (p1.m_age == p2.m_age) {return p1.m_height > p2.m_height;}else {return p1.m_age < p2.m_age;}
}void test01() {list<Person> L;Person p1("刘备",35,175);Person p2("曹操", 45, 180);Person p3("马超", 25, 190);Person p4("赵云", 35, 180);Person p5("张飞", 30, 200);L.push_back(p1);L.push_back(p2);L.push_back(p3);L.push_back(p4);L.push_back(p5);for (list<Person>::iterator it = L.begin(); it != L.end(); ++it) {cout << "姓名:" << it->m_name << " 年龄:" << (*it).m_age << " 身高:" << (*it).m_height << endl;}cout << "---------------------------" << endl;L.sort(Compareperson);for (list<Person>::iterator it = L.begin(); it != L.end(); ++it) {cout << "姓名:" << it->m_name << " 年龄:" << it->m_age << " 身高:" << it->m_height << endl;}
}int main() {test01();system("pause");return 0;
}

总结:

  • 对于自定义数据类型,必须要指定排序规则,否则编译器不知道如何进行排序
  • 高级排序只是在排序规则上在进行一次逻辑规则指定,并不复杂

相关文章:

09.list 容器

9、list 容器 功能&#xff1a; 将数据进行链式存储 链表&#xff08;list&#xff09;是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接实现的 链表的组成&#xff1a; 链表由一系列结点组成 结点的组成&#xff1a; 一个是存…...

速盾网络:网站用速盾cdn的好处

随着互联网的快速发展&#xff0c;网站的速度和稳定性成为了用户访问体验的关键因素。为了提高网站的性能和可用性&#xff0c;许多网站开始使用CDN&#xff08;Content Delivery Network&#xff09;服务。本文将介绍CDN的基本概念、工作原理以及使用CDN的好处。一、CDN的基本…...

Centos7在安装Graylog时新安装MongoDB报错端口不监听服务不启动无法运行启动失败

由于虚拟机服务器上需要安装Graylog需要安装MongoDB&#xff0c;尝试官网下载安装包&#xff0c;和yum安装均无法正常启动&#xff0c;折腾了好几天&#xff0c;重装了十几次&#xff0c;网上搜索了很多很多资料&#xff0c;均无法正常运行&#xff0c;百度上搜索各种文档&…...

Spark Machine Learning进行数据挖掘的简单应用(兴趣预测问题)

数据挖掘的过程 数据挖掘任务主要分为以下六个步骤&#xff1a; 1.数据预处理2.特征转换3.特征选择4.训练模型5.模型预测6.评估预测结果 数据准备 这里准备了20条关于不同地区、不同性别、不同身高、体重…的人的兴趣数据集&#xff08;命名为hobby.csv)&#xff1a; id,h…...

DRF从入门到精通二(Request源码分析、DRF之序列化、反序列化、反序列化校验、序列化器常用字段及参数、source、定制字段、保存数据)

文章目录 一、Request对象源码分析区分原生request和新生request新的request还能像原来的reqeust一样使用吗源码片段分析总结&#xff1a; 二、DRF之序列化组件序列化介绍序列化步骤序列化组件的基本使用反序列化基本使用反序列化的新增反序列化的新增删除单条 反序列化的校验序…...

Flink系列之:Upsert Kafka SQL 连接器

Flink系列之&#xff1a;Upsert Kafka SQL 连接器 一、Upsert Kafka SQL 连接器二、依赖三、完整示例四、可用元数据五、键和值格式六、主键约束七、一致性保证八、为每个分区生成相应的watermark九、数据类型映射 一、Upsert Kafka SQL 连接器 Scan Source: Unbounded 、Sink…...

前端与后端的异步编排(promise、async、await 、CompletableFuture)

前端与后端的异步编排 文章目录 前端与后端的异步编排1、为什么需要异步编排2、前端中的异步2.1 、Promise的使用2.1.1、Promise的基础概念2.1.2、Promise中的两个回调函数2.1.3、工具方法1、Promise.all(&#xff09;2、Promise.race()3、Promise.resolve() 2.2 、async 与 aw…...

python打开opencv图像与QImage图像及其转化

目录 1、Qimage图像 2、opencv图像 3、python打开QImage图像通过Qlabel控件显示 4、python打开QImage图像通过opencv显示 5、python打开opencv图像并显示 6、python打开opencv图像通过Qlabel控件显示 1、Qimage图像 QImage是Qt库中用于存储和处理图像的类。它可以存储多种…...

linux 其他版本RCU

1、不可抢占RCU 如果我们的需求是“不管内核是否编译了可抢占RCU&#xff0c;都要使用不可抢占RCU”&#xff0c;那么应该使用不可抢占RCU的专用编程接口。 读者使用函数rcu_read_lock_sched()标记进入读端临界区&#xff0c;使用函数rcu_read_unlock_ sched()标记退出读端临界…...

【单调栈】LeetCode:2818操作使得分最大

作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 涉及知识点 单调栈 题目 给你一个长度为 n 的正整数数组 nums 和一个整数 k 。 一开始&#xff0c;你的分数为 1 。你可以进行以下操作至多 k 次&#xff0c;目标是使你的分数最大&#xff1a; 选择一个之前没有选过的 非…...

uniapp 添加分包页面,配置分包预下载

为什么要分包 ? 分包即将小程序代码分成多个部分打包&#xff0c;可以减少小程序的加载时间&#xff0c;提升用户体验 添加分包页面 比较便捷的方法是使用vscode插件 uni-create-view 新建分包文件夹 以在我的页面&#xff0c;添加分包的设置页面为例&#xff0c;新建文件夹 s…...

成功案例分享:物业管理小程序如何助力打造智慧社区

随着科技的进步和互联网的普及&#xff0c;数字化转型已经渗透到各个行业&#xff0c;包括物业管理。借助小程序这一轻量级应用&#xff0c;物业管理可以实现线上线下服务的无缝对接&#xff0c;提升服务质量&#xff0c;优化用户体验。本文将详细介绍如何通过乔拓云网设计小程…...

Electron执行本地cmd命令

javascript执行本地cmd命令,javascript代码怎么执行_js调用本机cmd-CSDN博客 使用 Node.js 打开本地应用_nodejs启动应用-CSDN博客 笔记:nodejs脚本唤醒本地应用程序或者调用命令-CSDN博客 electron调起本地应用_electron 调用本地程序-CSDN博客 命令行打开vscode 你可以使用…...

YOLOv8改进 | 主干篇 | 利用MobileNetV3替换Backbone(轻量化网络结构)

一、本文介绍 本文给大家带来的改进机制是MobileNetV3&#xff0c;其主要改进思想集中在结合硬件感知的网络架构搜索&#xff08;NAS&#xff09;和NetAdapt算法&#xff0c;以优化移动设备CPU上的性能。它采用了新颖的架构设计&#xff0c;包括反转残差结构和线性瓶颈层&…...

MATLAB Mobile - 使用预训练网络对手机拍摄的图像进行分类

系列文章目录 前言 此示例说明如何使用深度学习对移动设备摄像头采集的图像进行分类。 在您的移动设备上安装和设置 MATLAB Mobile™。然后&#xff0c;从 MATLAB Mobile 的“设置”登录 MathWorks Cloud。 在您的设备上启动 MATLAB Mobile。 一、在您的设备上安装 MATLAB M…...

LangChain入门指南:定义、功能和工作原理

LangChain入门指南&#xff1a;定义、功能和工作原理 引言LangChain是什么&#xff1f;LangChain的核心功能LangChain的工作原理LangChain实际应用案例如何开始使用LangChain 引言 在人工智能的浪潮中&#xff0c;语言模型已成为推动技术革新的重要力量。从简单的文本生成到复…...

关键字:import关键字

在 Java 中&#xff0c;import关键字用于导入类或接口&#xff0c;使你可以在代码中使用它们而无需完全限定其名称。以下是使用import关键字的示例代码&#xff1a; 在上述示例中&#xff0c;通过使用import关键字导入了java.util.ArrayList类&#xff0c;这样就可以在代码中直…...

【C#】.net core 6.0 通过依赖注入注册和使用上下文服务

给自己一个目标&#xff0c;然后坚持一段时间&#xff0c;总会有收获和感悟&#xff01; 请求上下文是指在 Web 应用程序中处理请求时&#xff0c;包含有关当前请求的各种信息的对象。这些信息包括请求的头部、身体、查询字符串、路由数据、用户身份验证信息以及其他与请求相关…...

关于redis单线程和IO多路复用的理解

首先&#xff0c;Redis是一个高性能的分布式缓存中间件。其复杂性不言而喻&#xff0c;对于Redis整体而言肯定不是只有一个线程。 我们常说的Redis 是单线程&#xff0c;主要是指 Redis 在网络 IO和键值对读写是采用一个线程来完成的&#xff0c;这也是 Redis 对外提供键值存储…...

第四十一章 XML 映射参数摘要

文章目录 第四十一章 XML 映射参数摘要 第四十一章 XML 映射参数摘要 TopicParameters启用 XML 映射。XMLENABLED 类参数将属性映射到元素或属性。XMLPROJECTION property parameter ("NONE", "ATTRIBUTE", "XMLATTRIBUTE", "CONTENT"…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...