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

「C/C++」C++ STL容器库 之 std::list 双向链表容器

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「C/C++」C/C++程序设计
📚全部专栏
「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合
「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明

目录

      • std::list容器详解
        • 1. 容器说明
        • 2. 引用头文件
        • 3. 函数构造与对象初始化
        • 4. 元素访问
        • 5. 迭代器
        • 6. 容器修改器
        • 7. 元素比较
        • 8.反转\排序\交换
        • 总结与场景应用

std::list容器详解

在这里插入图片描述
上图截取自C++黑马课程

1. 容器说明

std::list是C++标准模板库(STL)中的一种双向链表容器,属于顺序容器的一种。与std::vectorstd::deque等容器不同,std::list在插入和删除操作上具有显著优势,特别是在容器的中间部分。std::list的每个元素包含指向前一个元素和后一个元素的指针,这使得在链表的任意位置进行插入和删除操作的时间复杂度为O(1)。然而,std::list不支持随机访问,访问某个位置的元素需要O(n)时间。

2. 引用头文件

在使用std::list之前,必须包含对应的头文件:

#include <list>
3. 函数构造与对象初始化

std::list提供了多种构造函数来初始化对象,包括默认构造函数、拷贝构造函数、赋值构造函数、初始化列表构造函数、迭代器范围构造函数、大小和值构造函数以及移动构造函数等。

  • 默认构造函数:创建一个空的list容器。
  • 拷贝构造函数:用另一个list容器来初始化一个新的list容器。
  • 赋值构造函数:通过赋值运算符从一个list容器创建另一个list容器。
  • 初始化列表构造函数:使用初始化列表来初始化list容器。
  • 迭代器范围构造函数:使用两个迭代器(指向容器或其他序列的起始和结束位置)来初始化list容器。
  • 大小和值构造函数:使用指定的大小和值来初始化list容器。
  • 移动构造函数(C++11开始支持):从另一个list容器移动元素来初始化新的list容器。

示例代码:

#include <list>
#include <iostream>int main() {// 默认构造函数std::list<int> lst1;// 初始化列表构造函数std::list<int> lst2 = {1, 2, 3, 4, 5};// 大小和值构造函数std::list<int> lst3(5, 10);// 拷贝构造函数std::list<int> lst4(lst2);// 输出list元素for (int elem : lst4) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}
4. 元素访问

在这里插入图片描述

std::list不支持通过下标随机访问元素,只能通过迭代器进行访问。访问某个位置的元素需要从头或尾开始遍历链表。

#include <list>
#include <iostream>int main() {std::list<int> lst = {1, 2, 3, 4, 5};std::cout << lst.front() << std::endl; // 输出:1std::cout << lst.back() << std::endl;  // 输出:5return 0;
}
5. 迭代器

在这里插入图片描述

std::list的迭代器可以双向移动,支持向前和向后遍历链表。迭代器的稳定性使得在插入和删除操作时,除了被删除的迭代器外,其余迭代器仍然有效。

#include <list>
#include <iostream>int main() {std::list<int> lst = {1, 2, 3, 4, 5};// 使用迭代器访问元素for (auto it = lst.begin(); it != lst.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}
6. 容器修改器

在这里插入图片描述

std::list提供了多种成员函数来修改容器,包括添加元素(push_back、push_front)、删除元素(pop_back、pop_front)、插入元素(insert)、删除指定位置的元素(erase)、合并和拼接(merge、splice)、移除元素(remove、remove_if)、排序(sort)等。

示例代码:

#include <list>
#include <iostream>int main() {std::list<int> lst = {1, 2, 3, 4, 5};// 在末尾添加元素lst.push_back(6);// 在前面添加元素lst.push_front(0);// 删除末尾元素lst.pop_back();// 删除前面元素lst.pop_front();// 插入元素auto it = lst.begin();++it; // 移动到第二个位置lst.insert(it, 10); // 在第二个位置插入10// 删除指定位置的元素it = lst.begin();++it; // 移动到第二个位置lst.erase(it); // 删除第二个位置的元素// 输出修改后的list元素for (const auto& elem : lst) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}
7. 元素比较

在这里插入图片描述

std::list的元素比较通常通过迭代器来实现,可以使用标准库中的算法函数(如std::equal)来比较两个list容器是否相等或具有相同的元素顺序。

8.反转\排序\交换
#include <list>
#include <iostream>
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;
}
int main()
{list<int> l = {90,20,30,40,50};//反转容器的元素l.reverse();printList(l); // 50 40 30 20 90 //排序l.sort(); //默认的排序规则 从小到大printList(l); // 20 30 40 50 90 list<int> l2 = {10,30,50,70,90};l.swap(l2);printList(l); // 10 30 50 70 90 
}
总结与场景应用

std::list容器具有动态大小、高效插入删除、内存分配灵活和双向遍历等优点,但访问元素速度较慢且内存开销较大。因此,std::list适用于需要在两端频繁插入和删除元素的场景,如排序算法中维护活跃连接列表、实现某种内存池或对象池等。同时,std::list也适用于处理大小动态变化的集合和需要双向遍历的场景。

通过合理的使用std::list容器,可以显著提高程序的灵活性和效率,特别是在需要频繁修改容器内容的场景中。


在这里插入图片描述

相关文章:

「C/C++」C++ STL容器库 之 std::list 双向链表容器

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...

应用程序框架进阶<HarmonyOS第一课>

一、判断题 1. 一个应用是由一个或多个HAP组成。 正确(True) 错误(False) 正确(True) 回答正确 2. UIAbility组件多实例启动模式是默认的启动模式。 正确(True)错误(False) 错误(False) 回答正确 二、单选题 1. 以下关于指定实例启动模式说法正确的是&#xff1f; …...

【C++】vector<string>-动态数组存储多个string

#1024程序员节 | 征文# //demo #include <iostream> #include <vector> #include <string>using namespace std; int main() {// 创建一个存储字符串的向量vector<string> Record;// 向向量中添加字符串Record.push_back("example");Record…...

66Analytics 汉化版,网站统计分析源码,汉化前台后台

66Analytics 汉化版,网站统计分析源码,汉化前台后台 本源码汉化前台后台&#xff0c;非其他只汉化前台版 网络分析变得容易。自托管、友好、一体化的网络分析工具。轻量级跟踪、会话回放、热图、用户旅程等 简单、好看、友好-大多数网络分析解决方案做得太多了&#xff0c;在大…...

蓝桥杯单片机STC15F2K60S2第十四届省赛代码详细讲解(附完整代码)

本文是写第十四届的蓝桥杯省赛代码&#xff0c;新手教程作者也写了一篇&#xff0c;欢迎去观看作者专门为新手写的一篇。也欢迎收录该专栏。 蓝桥杯单片机STC15F2K60S2第十三届省赛代码详细讲解&#xff08;附完整代码&#xff09; 专栏&#xff1a; 蓝桥杯单片机 然后接下来…...

[免费]SpringBoot+Vue智慧校园(校园管理)系统[论文+源码+SQL脚本]

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue智慧校园(校园管理)系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue智慧校园(校园管理)系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息技术的迅猛发展&#xff0c…...

景区导航地图怎么实现?基于LBS与3D GIS的智慧景区导航导览系统技术路线

随着经济的发展和人们物质生活水平改善,居民的旅游需求呈现多元化和个性化&#xff0c;自助旅游的人越来越多。许多游客在旅游行程中需要随时随地了解旅游景点有关的各类信息&#xff0c;如旅游景点介绍、推荐路线、地图导航等&#xff0c;合理规划和安排旅游线路。正是为了应对…...

RedisIO多路复用

一、多路复用要解决的问题: 并发多客户端连接&#xff0c;在多路复用之前的处理方案是同步阻塞网络IO模型&#xff0c;这种模型的特点就是用一个进程来处理一个网络连接。优点在于比较简单&#xff0c;缺点在于性能较差&#xff0c;每个用户请求到来都得占用一个进程来处理&am…...

C++的相关习题(2)

初阶模板 下面有关C中为什么用模板类的原因&#xff0c;描述错误的是? ( &#xff09; A.可用来创建动态增长和减小的数据结构 B.它是类型无关的&#xff0c;因此具有很高的可复用性 C.它运行时检查数据类型&#xff0c;保证了类型安全 D.它是平台无关的&#xff0c;可移植…...

C++《vector的模拟实现》

在之前《vector》章节当中我们学习了STL当中的vector基本的使用方法&#xff0c;了解了vector当中各个函数该如何使用&#xff0c;在学习当中我们发现了vector许多函数的使用是和我们之前学习过的string类的&#xff0c;但同时也发现vector当中一些函数以及接口是和string不同的…...

无人机避障——路径规划篇(一) JPS跳点搜索算法A*算法对比

JSP 跳点搜索算法与改进 A*算法对比 一、算法概述: 跳点搜索(Jump Point Search,JPS)算法:一种用于路径规划的启发式搜索算法。它主要用于在网格地图(如游戏地图、机器人运动规划地图等)中快速找到从起点到终点的最短路径。该算法在改进 A*算法的基础上进行了优化,通过跳过一…...

OpenCV ORB角点检测匹配和偏移计算

OpenCV ORB角点检测匹配和偏移计算 1. 简介2. ORB角点检测匹配和偏移计算2.1. 创建平移图片2.2. ORB角点检测2.3. ORB角点匹配2.4. 计算变换矩阵 1. 简介 首先通过 cv2.ORB_create 创建ORB检测器 orb&#xff0c; 然后通过 orb.detectAndCompute 检测两张图片获得ORB角点&…...

图文详解ChatGPT-o1完成论文写作的全流程

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 本月中旬OpenAI发布了OpenAI o1系列新的AI模型。 据OpenAI介绍&#xff0c;这些模型旨在花更多时间思考后再做出反应&#xff0c;就像人一样。通过训练&#xff0c;它们学会改进思维过…...

在线体验Sketch中文版,免费下载即刻上手!

Sketch是一款轻量而高效的矢量设计工具&#xff0c;助力全球设计师创造了诸多惊艳作品。安装Sketch的优势主要体现在其矢量编辑、控件和样式功能上。而下载安装“Sketch中文版”即时设计同样出色&#xff0c;它作为一站式设计平台&#xff0c;功能更全面。即时设计拥有纯中文的…...

Redis——缓存

目录 前言 一、缓存基本概念 1.概念 2.二八定律 二、使用 Redis 作为缓存 三、缓存的更新策略 1.定期生成 2.实时生成 四、Redis 内存淘汰机制 1.通用淘汰策略 &#xff08;1&#xff09;FIFO &#xff08;2&#xff09;LRU &#xff08;3&#xff09;LFU &#…...

RHCSA笔记三

第二章 linux中执行命令 命令格式 命令分为两类 内置命令&#xff1a;由 shell 程序自带的命令 外部命令&#xff1a;有独立的可执行程序文件&#xff0c;文件名即命令名 格式 主命令 参数 操作对象 # 注意&#xff1a; 下面是对于命令的语法的一些符号的说明&#xff1…...

【python】sorted() list.sort()

文章目录 sorted()和list.sort()sorted 函数sorted()根据键对字典排序根据字典的键排序根据字典的值排序将排序结果转换回字典 list.sort() 方法总结 keylambda student: student[age] sorted()和list.sort() 在Python中&#xff0c;sorted 函数和 list.sort() 方法都可以用来…...

训练集alpaca、sharegpt格式

LLaMA-Factory微调支持的格式 支持 alpaca 格式和 sharegpt 格式的数据集。 Alpaca格式 格式: [{"instruction": "人类指令(必填)","input": "人类输入(选填)","output": "模型回答(必填)","syst…...

Hive的数据存储格式

目录 一、前言 二、存储格式 2.1、文本格式&#xff08;TextFile&#xff09; 2.1.1、定义与特点 2.1.2、存储与压缩 2. 1.3、使用场景 2.2、行列式文件&#xff08;ORCFile&#xff09; 2.2.1、ORC的结构 2.2.2、ORC的数据类型 2.2.3、ORC的压缩格式 2.2.3、ORC存储…...

Linux Rsyslog 配置

1、Linux Rsyslog客户端配置 1&#xff09;安装rsyslog yum install rsyslog 2&#xff09;启用TCP或UDP传输 vim /etc/rsyslog.conf# Provides UDP syslog reception #若启用UDP进行传输&#xff0c;则取消下面两行的注释 #$ModLoad imudp #$UDPServerRun 514# Provide…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...