C++:list(1)list的使用

list的使用

  • 一.list基本的结构
      • 1.环状双向链表
      • 2.哨兵节点
      • 3.迭代器
      • 4.节点结构
      • 5.链表遍历
      • 6.迭代器失效
  • 二.list的基本使用
      • 1.`test01`函数:主要测试`std::list`的初始化方式及遍历
      • 2.`test02`函数:主要测试`std::list`的常用成员函数操作
      • 3.测试结果如下
  • 三.list的其他操作(了解)
      • 2. remove(按值移除)
      • 3. remove_if(按条件移除)
      • 4. unique(移除相邻重复)
      • 5. merge(合并有序链表)
      • 6. reverse(反转元素顺序)

一.list基本的结构

在这里插入图片描述
以上图片展示了一个 C++ 标准库中的 std::list 容器的内部结构:

1.环状双向链表

  • std::list 是环状双向链表。
  • 最后一个节点的 next 指向头节点。
  • 头节点的 prev 指向最后一个节点。

2.哨兵节点

  • 图中红色方框标注的是哨兵节点。
  • 哨兵节点不存储实际数据。
  • 哨兵节点的 next 指向第一个数据节点。
  • 哨兵节点的 prev 指向最后一个数据节点。

3.迭代器

  • begin() 返回指向第一个数据节点的迭代器。
  • end() 返回指向哨兵节点的迭代器。
  • 迭代器通过 _M_node 指针访问节点。

4.节点结构

  • 每个节点包含数据值(如图中 0、2、3、4 等)。
  • 包含指向前一个节点的指针(prev)。
  • 包含指向后一个节点的指针(next)。

5.链表遍历

  • 正向遍历:从 begin() 开始,通过 next 指针依次访问节点。
  • 逆向遍历:从 end() 开始,通过 prev 指针依次访问节点。

6.迭代器失效

  • 当链表结构改变时(如插入或删除节点),迭代器可能失效。
  • 失效的迭代器不能再用于访问链表。

二.list的基本使用

对C++ 标准库中 std::list 容器部分成员函数的测试。展示了std::list 的多种操作方式,包括初始化、插入元素、调整大小、删除元素等。

#include<iostream>
#include<list>
#include<vector>
using namespace std;// 测试 list 的初始化和基本遍历
void test01()
{// 默认构造函数创建空列表list<int> lt1;// 使用初始化列表构造列表list<int> lt2 = { 0,1,2,3,4,5 };// 创建包含10个元素的列表,每个元素初始化为1list<int> lt3(10, 1);// 从数组中前5个元素构造列表int a[] = { 5,4,3,2,1,0 };list<int> lt4(a, a + 5);// 正确遍历方法:基于范围的for循环cout << "lt4: ";for (auto e : lt4){cout << e << " ";}cout << endl;
}// 测试 list 的插入、修改和删除操作
void test02()
{// 使用初始化列表构造并插入元素list<int> lt1 = { 0,1,2,3,4,5 };lt1.insert(lt1.begin(), 666);  // 在头部插入元素// 复制构造list<int> lt2(lt1);lt2.push_back(999);           // 在尾部添加元素lt2.resize(10, 77);           // 调整大小,不足部分用77填充cout << "lt2: ";for (auto e : lt2){cout << e << " ";}cout << endl;// 复制列表并调整大小(截断)list<int> lt3 = lt2;lt3.resize(5, 0);             // 调整为5个元素,超出部分截断cout << "lt3: ";for (auto e : lt3){cout << e << " ";}cout << endl;// 删除特定值的所有元素list<int> lt4(lt2);lt4.remove(77);               // 删除所有值为77的元素cout << "lt4: ";for (auto e : lt4){cout << e << " ";}cout << endl;
}int main() {test01();cout << endl;test02();return 0;
}

以下是对代码中test01test02函数测试内容的分要点梳理:

1.test01函数:主要测试std::list的初始化方式及遍历

  1. 初始化测试

    • 默认构造:list<int> lt1;(创建空列表)
    • 初始化列表构造:list<int> lt2 = {0,1,2,3,4,5};(用初始化列表直接赋值元素)
    • 指定大小和值构造:list<int> lt3(10, 1);(创建包含10个元素、每个元素值为1的列表)
    • 数组范围构造:list<int> lt4(a, a + 5);(用数组a中从aa+5的元素初始化列表,即取前5个元素5,4,3,2,1
  2. 遍历测试

    • 使用基于范围的for循环遍历lt4并输出元素,验证初始化结果是否正确。

2.test02函数:主要测试std::list的常用成员函数操作

  1. 插入操作

    • lt1.insert(lt1.begin(), 666);:在lt1的开头位置插入元素666
  2. 复制构造

    • list<int> lt2(lt1);:通过复制构造函数,创建lt1的副本lt2
  3. 尾部添加

    • lt2.push_back(999);:在lt2的末尾添加元素999
  4. 调整大小

    • lt2.resize(10, 77);:将lt2的大小调整为10,若原大小不足,用77填充剩余位置。
    • lt3.resize(5, 0);:将lt3的大小调整为5,若原大小超出,截断多余元素(填充值0在此处无效,因仅截断不新增)。
  5. 删除元素

    • lt4.remove(77);:删除lt4中所有值为77的元素。
  6. 遍历输出

    • 所有列表均通过基于范围的for循环遍历输出,验证上述操作的结果是否正确。

3.测试结果如下

lt4: 5 4 3 2 1 lt2: 666 0 1 2 3 4 5 999 77 77 
lt3: 666 0 1 2 3 
lt4: 666 0 1 2 3 4 5 999 

三.list的其他操作(了解)

在这里插入图片描述### 1. splice(转移元素)

  • 核心功能:把一个 list 里的元素(单个、区间或整个链表)转移到另一个 list 里,原 list 对应元素会被移除。
  • 关键特点
    • 高效:直接调整链表指针,不用拷贝元素,处理大数据量时速度优势明显。
    • “搬家式” 转移:原 list 被转移的元素位置会 “空出来”,目标 list 把这些元素 “接过去” 。
  • 典型场景:需要在不同链表间快速调整元素归属,比如链表拼接、拆分逻辑,像合并订单链表时,把临时链表的订单直接转移到主链表 。

2. remove(按值移除)

  • 核心功能:遍历链表,把所有值和指定值一样的元素都删掉。
  • 关键特点
    • 精准定值删除:简单直接,给定一个具体值(如 5 ),就能清理链表里所有该值的元素。
    • 遍历式删除:逐个检查元素值,匹配就删除,适合明确知道要删什么值的场景。
  • 典型场景:数据清理时,删除链表中特定标识的元素,比如用户链表删除 ID 为 001 的用户记录 。

3. remove_if(按条件移除)

  • 核心功能:依据自定义条件(像元素大小、是否满足某种规则),删除符合条件的元素。
  • 关键特点
    • 灵活自定义:用 lambda 表达式、函数对象等设定条件(比如删偶数、删大于某个阈值的数 ),应对复杂删除需求。
    • 逻辑拓展性强:不管是简单的数值判断,还是涉及元素对象属性的复杂逻辑,都能实现删除。
  • 典型场景:业务规则筛选删除,比如订单链表删除金额小于 1 元的无效订单,学生链表删除成绩不及格的记录 。

4. unique(移除相邻重复)

  • 核心功能:去掉链表中相邻的重复元素,只留一个。若要整体去重,一般得先排序让重复元素相邻。
  • 关键特点
    • 相邻限定:只处理 “紧挨着” 的重复,没排序的话,分散的重复元素删不掉。
    • 简化存储:适合对连续重复数据做 “压缩”,像统计链表中连续相同数值的个数后,保留一个代表值 。
  • 典型场景:处理传感器连续采集的重复数据、文本处理中连续重复的字符(排序后去相邻重复 ),比如日志链表清理连续重复的状态记录 。

5. merge(合并有序链表)

  • 核心功能:把两个已经有序的链表合并成一个新的有序链表,原被合并的链表会被清空。
  • 关键特点
    • 前提条件:两个链表自身得是有序的(升序或降序,需保持一致 ),否则合并结果会混乱。
    • 归并特性:常和归并排序搭配,拆分后合并有序子链表;也用于整合多个有序链表结果。
  • 典型场景:归并排序算法里合并阶段、合并多个按时间排序好的日志链表,比如服务器把不同时段有序的操作日志链表合并 。

6. reverse(反转元素顺序)

  • 核心功能:把链表中元素的顺序完全颠倒,第一个变最后一个,最后一个变第一个。
  • 关键特点
    • 指针调整实现:通过修改链表节点间的指针指向,改变元素遍历顺序,不用额外空间拷贝。
    • 逻辑简单直接:一步操作就能实现逆序,满足逆序处理数据需求。
  • 典型场景:链表数据需要逆序展示(如聊天记录从最新到最早展示时反转 )、数学运算中链表存储数字的逆序处理(像链表存 1->2->3 代表 123,反转后计算 321 )。

以上这些要点清晰梳理了每个函数 “能干什么、有啥特点、啥时候用”,方便理解 list 这些操作在实际场景的价值 。

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

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

相关文章

ArcGIS地形起伏度计算

地形起伏度计算地形起伏度步骤1&#xff1a;计算最大值。步骤2&#xff1a;计算最小值。步骤3&#xff1a;计算地形起伏度。地形起伏度、地形粗糙度、地表切割深度和高程变异系数均为坡面复杂度因子&#xff0c;是一种宏观的地形信息因子&#xff0c;反映的是较大的区域内地表坡…

llama factory新手初步运行完整版

1、新建conda环境名称为llama_factory&#xff0c;并激活 conda create -n llama_factory python3.10 conda activate llama_factory2、激活后可检查内部包是否纯净&#xff0c;要确保环境内包较纯净&#xff0c;不然后续安装对应包会出现一系列水土不服的问题&#xff0c;导致…

Tomcat与JDK版本对照全解析:避坑指南与生产环境选型最佳实践

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 持续学习&#xff0c;不断…

短视频矩阵的未来前景:机遇无限,挑战并存

在当今数字化信息飞速传播的时代&#xff0c;短视频以其独特的魅力迅速席卷全球&#xff0c;成为人们获取信息、娱乐消遣的重要方式之一。短视频矩阵作为一种高效的内容传播与运营模式&#xff0c;正逐渐展现出其强大的影响力和潜力。本文将深入探讨短视频矩阵的未来前景&#…

【数据结构】哈希——位图与布隆过滤器

目录 位图&#xff1a; 引入 位图实现&#xff1a; 位图的结构 插入数据(标记数据) 删除数据(重置数据) 查找数据 位图完整代码&#xff1a; 位图的优缺点&#xff1a; 布隆过滤器&#xff1a; 引入 布隆过滤器实现&#xff1a; 布隆过滤器的结构&#xff1a; 插入…

本地运行C++版StableDiffusion!开源应用StableVerce发布

本地运行C版StableDiffusion&#xff01;开源应用StableVerce发布 StableVerse是一个用C开发的本地运行的图形工具。适合初学者快速入门&#xff1b;适用于办公室工作人员的文本和图像制作的小规模计算能力场景。 开源地址&#xff1a;https://github.com/kelvin-luo/StableVer…

OpenLayers 快速入门(七)矢量数据

看过的知识不等于学会。唯有用心总结、系统记录&#xff0c;并通过温故知新反复实践&#xff0c;才能真正掌握一二 作为一名摸爬滚打三年的前端开发&#xff0c;开源社区给了我饭碗&#xff0c;我也将所学的知识体系回馈给大家&#xff0c;助你少走弯路&#xff01; OpenLayers…

【PTA数据结构 | C语言版】关于堆的判断

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 将一系列给定数字顺序插入一个初始为空的最小堆。随后判断一系列相关命题是否为真。命题分下列几种&#xff1a; x is the root&#xff1a;x是根结点&#xff1b;x and y are siblings&#xff1a…

[CH582M入门第十步]蓝牙从机

前言 学习目标: 1、初步了解BLE协议 2、BLE从机代码解析 3、使用手机蓝牙软件控制CH582M从机LED亮灭一、蓝牙介绍 蓝牙(Bluetooth)是一种短距离无线通信技术,主要用于设备之间的数据传输和通信。它由爱立信(Ericsson)于1994年提出,现由蓝牙技术联盟(Bluetooth SIG)维…

力扣(LeetCode) ——轮转数组(C语言)

题目&#xff1a;轮转数组 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例1&#xff1a; 输入&#xff1a; nums [1,2,3,4,5,6,7]&#xff0c;k 3 输出&#xff1a; [5,6,7,1,2,3,4] 解释&#xff1a; 向右轮转 1 步:…

Rocky9部署Zabbix7(小白的“升级打怪”成长之路)

目录 一、关闭防火墙和SElinux和配置安装源 二、zabbxi服务器配置 1、安装Zabbix server&#xff0c;Web前端&#xff0c;agent &#xff0c;mysql-server 2、配置mysql数据库 3、为Zabbix server配置数据库 4、启动对应服务 三、登录zabbix 四、客户端部署 五、解决中…

python安装package和pycharm更改环境变量

安装numpy包 1、找到对应python版本的numpy包的版本 NumPy - News确认适配python版本的numpy&#xff0c;我安装 的python是3.11所以安装的numpy是2.2.0 2、修改pip安装的镜像源 1、全局修改&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.c…

Redis中的setnx命令为什么是原子性的

Redis的SETNX命令是一个原子性操作&#xff0c;这得益于其单线程架构的特性。Redis采用单线程模型&#xff0c;所有命令都在主线程中顺序执行&#xff0c;确保每个操作都具有原子性。执行SETNX时&#xff0c;Redis会首先检查指定key是否存在&#xff1a;若不存在则设置值并返回…

深入解析Hadoop中的EditLog与FsImage持久化设计及Checkpoint机制

HDFS元数据管理概述在HDFS&#xff08;Hadoop Distributed File System&#xff09;的架构中&#xff0c;元数据管理是保证系统可靠性和性能的核心环节。NameNode作为HDFS的主节点&#xff0c;负责维护整个文件系统的命名空间和文件到数据块的映射关系。这些元数据的高效管理直…

MFC类Qt的自动布局框架

由于作者习惯使用Qt&#xff0c;习惯了其框架下的水平和垂直布局。但在使用MFC时&#xff0c;却发现并没有十分好用的布局框架&#xff0c;检索了部分资料&#xff0c;发现要么不提供源码&#xff0c;要么方案不理想。搜索了很多资料&#xff0c;最终发现一个可用方案&#xff…

认识Transformer架构

一.前言前面我们介绍了RNN相关系列的模型&#xff0c;在当今大模型时代大家认识一下就好了&#xff0c;而本章节我们是要来介绍一下重中之重的Transformer模型&#xff0c;本章节就来介绍一下他的架构&#xff0c;了解Transformer模型的作⽤以及了解Transformer总体架构图中各个…

Python学习之存数据

在得到了对应的数据之后可以考虑用文件或者数据库的方式把内容持久化下来方便之后的分析&#xff0c;此时可以使用pymongo库&#xff0c;寥寥几行代码&#xff0c;数据就已经很好地存储下来。&#xff08;此处可参考我们之前发的文章)在 Python 中引入&#xff1a;import pymon…

PointLLM - ECCV 2024 Best Paper Candidate

https://github.com/OpenRobotLab/PointLLM PointLLM: Empowering Large Language Models to Understand Point Clouds 核心问题 对比两种让大型语言模型&#xff08;LLM&#xff09;“看懂”三维世界的方法 间接方法&#xff1a;通过2D图像进行猜测。 这是目前比较常见但充…

前端-CSS-day6

目录 1、相对定位 2、绝对定位 3、绝对定位-居中 4、固定定位 5、堆叠顺序 6、CSS精灵-基本使用 7、案例-京东服务 8、字体图标-体验 9、使用字体图标 10、垂直对齐方式 11、过渡 12、透明度 13、光标类型 14、综合案例-轮播图 1、相对定位 <!DOCTYPE html>…

在离线 Ubuntu 22.04机器上运行 ddkj_portainer-cn 镜像 其他相关操作也可以复刻 docker

以下有免费的4090云主机提供ubuntu22.04系统的其他入门实践操作 地址&#xff1a;星宇科技 | GPU服务器 高性能云主机 云服务器-登录 相关兑换码星宇社区---4090算力卡免费体验、共享开发社区-CSDN博客 兑换码要是过期了&#xff0c;可以私信我获取最新兑换码&#xff01;&a…