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

List详解 - 双向链表的操作

在C++中,std::list是标准模板库(STL)中的一个容器,它实现了双向链表的数据结构。与数组或向量(std::vector)不同,std::list允许在常数时间内进行插入和删除操作,尤其是在链表的任意位置。本文将详细介绍std::list的基本操作,并通过示例代码帮助读者理解其使用方法。

1. std::list 的基本概念

std::list是一个双向链表,每个元素都包含两个指针,分别指向前一个和后一个元素。这种结构使得在链表中插入和删除元素非常高效,但访问元素的速度较慢,因为需要从头或尾开始遍历。

1.1 头文件

要使用std::list,首先需要包含头文件:

#include <list>

1.2 定义和初始化

std::list的定义和初始化方式与其他STL容器类似:

std::list<int> myList;  // 定义一个空的int类型链表
std::list<int> myList2 = {1, 2, 3, 4, 5};  // 定义并初始化一个链表

2. std::list 的基本操作

2.1 插入元素

std::list提供了多种插入元素的方法:

  • push_back():在链表末尾插入元素。
  • push_front():在链表开头插入元素。
  • insert():在指定位置插入元素。
std::list<int> myList = {1, 2, 3};myList.push_back(4);  // 链表变为 {1, 2, 3, 4}
myList.push_front(0); // 链表变为 {0, 1, 2, 3, 4}auto it = myList.begin();
std::advance(it, 2);  // 将迭代器移动到第三个元素
myList.insert(it, 10); // 链表变为 {0, 1, 10, 2, 3, 4}

2.2 删除元素

std::list也提供了多种删除元素的方法:

  • pop_back():删除链表末尾的元素。
  • pop_front():删除链表开头的元素。
  • erase():删除指定位置的元素。
  • remove():删除所有等于指定值的元素。
std::list<int> myList = {0, 1, 10, 2, 3, 4};myList.pop_back();  // 链表变为 {0, 1, 10, 2, 3}
myList.pop_front(); // 链表变为 {1, 10, 2, 3}auto it = myList.begin();
std::advance(it, 1);  // 将迭代器移动到第二个元素
myList.erase(it);     // 链表变为 {1, 2, 3}myList.remove(2);     // 链表变为 {1, 3}

2.3 访问元素

由于std::list是双向链表,不支持随机访问。要访问元素,必须使用迭代器:

std::list<int> myList = {1, 2, 3, 4, 5};for (auto it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";  // 输出: 1 2 3 4 5
}

2.4 链表的大小和清空

  • size():返回链表中元素的数量。
  • empty():检查链表是否为空。
  • clear():清空链表中的所有元素。
std::list<int> myList = {1, 2, 3};std::cout << "Size: " << myList.size() << std::endl;  // 输出: Size: 3
std::cout << "Is empty? " << myList.empty() << std::endl;  // 输出: Is empty? 0myList.clear();  // 清空链表
std::cout << "Is empty? " << myList.empty() << std::endl;  // 输出: Is empty? 1

2.5 链表的排序和反转

  • sort():对链表中的元素进行排序。
  • reverse():反转链表中的元素顺序。
std::list<int> myList = {3, 1, 4, 1, 5, 9};myList.sort();  // 链表变为 {1, 1, 3, 4, 5, 9}
myList.reverse();  // 链表变为 {9, 5, 4, 3, 1, 1}

3. std::list 的高级操作

3.1 合并链表

std::list提供了merge()方法,用于合并两个已排序的链表:

std::list<int> list1 = {1, 3, 5};
std::list<int> list2 = {2, 4, 6};list1.merge(list2);  // list1 变为 {1, 2, 3, 4, 5, 6}, list2 变为空

3.2 拼接链表

std::listsplice()方法可以将一个链表的部分或全部元素移动到另一个链表中:

std::list<int> list1 = {1, 2, 3};
std::list<int> list2 = {4, 5, 6};auto it = list1.begin();
std::advance(it, 1);  // 将迭代器移动到第二个元素
list1.splice(it, list2);  // list1 变为 {1, 4, 5, 6, 2, 3}, list2 变为空

3.3 去重

std::listunique()方法可以删除链表中连续的重复元素:

std::list<int> myList = {1, 1, 2, 3, 3, 3, 4};myList.unique();  // 链表变为 {1, 2, 3, 4}

4. 总结

std::list是C++中一个非常强大的容器,特别适合需要频繁插入和删除操作的场景。通过本文的介绍,读者应该能够掌握std::list的基本操作和高级功能。在实际编程中,合理使用std::list可以大大提高代码的效率和可读性。

希望本文对你理解和使用std::list有所帮助!如果你有任何问题或建议,欢迎在评论区留言讨论。

相关文章:

List详解 - 双向链表的操作

在C中&#xff0c;std::list是标准模板库&#xff08;STL&#xff09;中的一个容器&#xff0c;它实现了双向链表的数据结构。与数组或向量&#xff08;std::vector&#xff09;不同&#xff0c;std::list允许在常数时间内进行插入和删除操作&#xff0c;尤其是在链表的任意位置…...

多目标优化算法之一:基于分解的方法

在多目标优化算法中,“基于分解的方法”通常指的是将多目标优化问题(MOP)分解为多个单目标优化子问题,并同时优化这些子问题。这种方法的核心思想是通过引入权重向量或参考点,将多目标问题转化为多个标量优化问题,每个子问题都关注于原始问题的一个特定方面或视角。这样可…...

conntrack iptables 安全组

centos 安装yum install conntrack-tools 1. conntrack状态 NEW: 新建连接&#xff08;第一次包&#xff09;。 ESTABLISHED: 已建立连接&#xff0c;正在传输数据。 RELATED: 与已有连接相关的连接&#xff0c;如 FTP 数据连接。 INVALID: 无效连接&#xff0c;无法识别或不…...

stringRedisTemplate.execute执行lua脚本

stringRedisTemplate.execute执行lua脚本 1. 引入必要依赖 确保项目中已经引入了Spring Data Redis相关依赖&#xff0c;例如在 Maven 项目中&#xff0c;一般会有如下依赖&#xff08;版本号根据实际情况调整&#xff09;&#xff1a; <dependency><groupId>or…...

HDFS异构存储和存储策略

一、HDFS异构存储类型 1.1 冷、热、温、冻数据 通常&#xff0c;公司或者组织总是有相当多的历史数据占用昂贵的存储空间。典型的数据使用模式是新传入的数据被应用程序大量使用&#xff0c;从而该数据被标记为"热"数据。随着时间的推移&#xff0c;存储的数据每周…...

生成idea ui风格界面代码

创建一个类似 IntelliJ IDEA 的用户界面&#xff08;UI&#xff09;涉及多个组件和复杂的布局设计。为了简化这个过程&#xff0c;我们可以使用 **Java Swing** 或 **JavaFX** 来实现一个基本的 IDE 界面&#xff0c;模仿 IntelliJ IDEA 的主要布局元素&#xff0c;如菜单栏、工…...

嵌入式C语言:二维数组

目录 一、二维数组的定义 二、内存布局 2.1. 内存布局特点 2.2. 内存布局示例 2.2.1. 数组元素地址 2.2.2. 内存布局图&#xff08;简化表示&#xff09; 2.3. 初始化对内存布局的影响 三、访问二维数组元素 3.1. 常规下标访问方式 3.2. 通过指针访问 3.2.1. 指向数…...

【机器学习:四、多输入变量的回归问题】

多输入变量的回归问题 1. 多元线性回归概述 1.1 单变量线性回归与多变量线性回归的概念区分 单变量线性回归&#xff1a;用于预测一个因变量&#xff08;输出变量&#xff09;与单一自变量&#xff08;输入变量&#xff09;之间的线性关系。模型形式为&#xff1a; y θ 0 …...

JVM实战—OOM的定位和解决

1.如何对系统的OOM异常进行监控和报警 (1)最佳的解决方案 最佳的OOM监控方案就是&#xff1a;建立一套监控平台&#xff0c;比如搭建Zabbix、Open-Falcon之类的监控平台。如果有监控平台&#xff0c;就可以接入系统异常的监控和报警&#xff0c;可以设置当系统出现OOM异常&…...

iOS 本地新项目上传git仓库,并使用sourceTree管理

此文记录的场景描述&#xff1a; iOS前期开发时&#xff0c;在本地创建项目&#xff0c;直至开发一段时间&#xff0c;初期编码及框架已完善后&#xff0c;才拿到git仓库的地址。此时需要将本地代码上传到git仓库。 上传至git仓库&#xff0c;可以使用终端&#xff0c;键入命令…...

mysql之基本select语句 运算符 排序分页

1.SQL的分类 DDL:数据定义语言. CREATE ALTER DROP RENAME TRUNCATE DML: 数据操作语言. INSERT DELETE UPDATE SELECT 重中之重 DCL: 数据控制语言. COMMIT ROLLBACK SAVEPOINT GRANT REVOKE 2.SQL语言的规则与规范 1.基本规则 SQL可以在一行或多行,为了提高可…...

如何在 Ubuntu 22.04 上安装 Nagios 服务器教程

简介 在本教程中&#xff0c;我们将解释如何在 Ubuntu 22.04 上安装和配置 Nagios&#xff0c;使用 Apache 作为 Web 服务器&#xff0c;并通过 Let’s Encrypt Certbot 使用 SSL 证书进行保护。 Nagios 是一个强大的监控系统&#xff0c;它可以帮助组织在 IT 基础设施问题影…...

数据库事务:确保数据一致性的关键机制

1. 什么是数据库事务 定义&#xff1a;事务&#xff08;Transaction&#xff09;是数据库管理系统中的一个逻辑工作单元&#xff0c;用于确保一组相关操作要么全部成功执行&#xff0c;要么全部不执行&#xff0c;从而维护数据的一致性和完整性。重要性&#xff1a;在多用户环…...

词作词汇积累:错付、大而无当、语焉不详、愈演愈烈

错付 1、基本介绍 【错付】是错误地付出或投入&#xff0c;特别是在感情、信任或资源方面。 【错付】代表投入的东西没有得到应有的回报&#xff0c;或者投入的对象并不值得。 2、实例实操 1. 她将所有的爱与关怀都【错付】给了那个不懂珍惜的人。2. 多年的努力似乎【错付…...

selenium学习笔记

一.搭建环境 1.安装chrome #下载chrome wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb#安装chrome apt --fix-broken install ./google-chrome-stable_current_amd64.deb2.安装chromedriver 首先先查看版本&#xff1a;google-chrome --…...

asp.net core webapi 并发请求时 怎么保证实时获取的用户信息是此次请求的?

对于并发请求&#xff0c;每个请求会被分配到一个独立的线程或线程池工作线程上。通过 HttpContext 或 AsyncLocal&#xff0c;每个线程都能独立地获取到它自己的上下文数据。由于这些数据是与当前请求相关的&#xff0c;因此在并发请求时不会互相干扰。 在并发请求时&#xf…...

实时数仓:基于数据湖的实时数仓与数据治理架构

设计一个基于数据湖的实时数仓与数据治理架构&#xff0c;需要围绕以下几个核心方面展开&#xff1a;实时数据处理、数据存储与管理、数据质量治理、数据权限管理以及数据消费。以下是一个参考架构方案&#xff1a; 一、架构整体概览 核心组成部分 数据源层 数据来源&#xff…...

STM32 拓展 RTC案例1:使用闹钟唤醒待机模式 (HAL库)

需求描述 执行完毕正常代码之后&#xff0c;让MCU进入待机模式&#xff0c;设置闹钟&#xff0c;自动让MCU从待机模式中被唤醒。可以用led点亮熄灭显示是否唤醒。 应用场景&#xff1a;比如设计一个野外温度自动采集的设备&#xff0c;规定每小时采集一次温度&#xff0c;就可…...

ESP32S3使用串口0作为LOG输出

配置 配置串口&#xff0c;在内存保护这个选项里Memory protection 修改内存申请函数 测试代码 uint8_t buf1 heap_caps_malloc(320*240 * sizeof(lv_color_t), MALLOC_CAP_SPIRAM); ESP_LOGI("Test", "%d", buf1);sprintf(buffer, " Biggest / …...

Linux:深入了解fd文件描述符

目录 1. 文件分类 2. IO函数 2.1 fopen读写模式 2.2 重定向 2.3 标准文件流 3. 系统调用 3.1 open函数认识 3.2 open函数使用 3.3 close函数 3.4 write函数 3.5 read函数 4. fd文件描述符 4.1 标准输入输出 4.2 什么是文件描述符 4.3 语言级文件操作 1. 文件分类…...

政务行业高准确率、可控、符合规范的数据库审计与监测实践方案

一、概要&#xff1a;以高精准风险监测与全链路审计&#xff0c;构筑政务数据安全可控防线在国家数字化治理体系纵深推进的背景下&#xff0c;政务数据已成为驱动政府决策、公共服务与社会管理的关键生产要素。然而&#xff0c;随着政务云、数据共享交换平台的大规模建设&#…...

软件开发常见骗局有哪些?

虚假高薪招聘陷阱以“零经验高薪入职”“包就业”为噱头&#xff0c;要求求职者付费培训。实际培训内容质量低下&#xff0c;承诺的就业机会无法兑现&#xff0c;甚至诱导贷款支付培训费用。外包项目诈骗谎称有高额预算项目外包&#xff0c;要求开发者支付“保证金”或“预付款…...

2026年社会学论文降AI率工具推荐:田野调查和访谈记录部分

2026年社会学论文降AI率工具推荐&#xff1a;田野调查和访谈记录部分 同学群里有人问社会学论文降AI工具推荐&#xff0c;我发现自己每次回答都差不多——嘎嘎降AI。干脆写一篇详细的推荐文章&#xff0c;省得每次重复。 直接结论&#xff1a;嘎嘎降AI&#xff08;www.aigcle…...

PADS VX2.8 极坐标布局技巧:圆形灯板LED高效排列指南

1. 极坐标布局在圆形灯板设计中的核心价值 第一次接触圆形LED灯板设计时&#xff0c;我被密密麻麻的元件排列搞得头晕眼花。传统直角坐标系下&#xff0c;要精确控制每个LED灯珠的间距和角度&#xff0c;需要反复计算XY坐标&#xff0c;效率极低。直到发现PADS VX2.8的极坐标功…...

批量图片添加文字水印工具:Windows 上手指南(预览与平铺)

面向需要在 Windows 上 批量 给 图片 叠 文字水印 的同事&#xff0c;工具名【批量图片添加文字水印工具】。下文只写能力与操作顺序&#xff0c;不写实现细节。输入与目录支持选择多个文件或整个文件夹&#xff0c;路径可拖拽填入&#xff1b;多文件路径用分号分隔。勾选「遍历…...

Go语言如何部署到K8s_Go语言Kubernetes部署教程【进阶】

Go服务容器化失败主因是镜像路径与WORKDIR不匹配、containerPort未对齐监听端口、Probe未适配程序健康接口、ConfigMap/Secret挂载权限不足&#xff0c;需逐一核验镜像内容、网络声明、文件权限及进程监听行为。Go 服务打包成容器镜像时&#xff0c;main.go 路径和 WORKDIR 不匹…...

MySQL 生产环境故障排查与性能优化全攻略(8.0 版本实战)

前言MySQL 作为目前企业级应用最广泛的开源关系型数据库&#xff0c;在生产环境中承担着核心数据存储与处理任务。默认配置往往无法满足高并发、大数据量的业务场景&#xff0c;同时运维过程中也会频繁遇到各类故障。本文基于 MySQL 8.0 版本&#xff0c;从单实例故障、主从复制…...

革命性终端网站构建工具LiveTerm:5分钟打造个性化网页终端

革命性终端网站构建工具LiveTerm&#xff1a;5分钟打造个性化网页终端 【免费下载链接】LiveTerm &#x1f4bb; Build terminal styled websites in minutes! 项目地址: https://gitcode.com/gh_mirrors/li/LiveTerm LiveTerm是一款革命性的终端网站构建工具&#xff0…...

RexUniNLU零样本实战:智能家居指令解析,5分钟快速上手

RexUniNLU零样本实战&#xff1a;智能家居指令解析&#xff0c;5分钟快速上手 1. 为什么选择RexUniNLU处理智能家居指令&#xff1f; 1.1 智能家居场景的特殊挑战 智能家居领域面临两大核心难题&#xff1a;指令多样性和用户表达随意性。同一操作可能有数十种表达方式&#…...

Qwen2.5-14B-Instruct部署案例:高校戏剧系用像素剧本圣殿教学实践

Qwen2.5-14B-Instruct部署案例&#xff1a;高校戏剧系用像素剧本圣殿教学实践 1. 项目背景与价值 在戏剧创作教学中&#xff0c;传统剧本创作方式面临诸多挑战&#xff1a;学生创意受限、格式不规范、修改成本高。某高校戏剧系引入基于Qwen2.5-14B-Instruct深度优化的"像…...