探索C++ STL中的std::list:链式存储的艺术与实践

news2025/1/19 16:58:17

目录

​编辑

引言

一、std::list详解

二、std::list的关键成员函数

三、示例代码

四、std::list与std::vector的对比

内存布局:

插入与删除:

迭代器稳定性:

五、应用场景

结语


引言

在C++标准模板库(STL)中,std::list作为一个双向链表容器,提供了丰富的成员函数,用于对链表进行高效管理。本文将详细介绍std::list的一些关键内部函数,以及它们如何帮助我们更有效地操作链表。

一、std::list详解

std::list是一个双向链表,每个元素都有一个指向其前驱和后继的指针。这种结构使得在列表中间插入或删除元素非常高效,时间复杂度为O(1),因为只需要修改相邻节点的指针即可,无需像数组那样移动大量元素。

二、std::list的关键成员函数
  1. emplace()

    • 用于在链表中指定位置构造并插入新元素,避免了元素拷贝或移动的开销。
  2. splice()

    • 允许将一个std::list中的元素移动到另一个std::list中,可以是单个元素或整个范围。
  3. merge()

    • 将两个有序的std::list合并成一个有序的std::list,适用于排序后的列表合并。
  4. unique()

    • 删除相邻重复元素,仅保留第一个出现的元素。
  5. reverse()

    • 反转链表中元素的顺序。
  6. sort()

    • 对链表中的元素进行排序。
三、示例代码

下面是一些使用std::list内部函数的示例代码:

#include <iostream>
#include <list>

int main() {
    std::list<int> list1 = {1, 3, 5};
    std::list<int> list2 = {2, 4, 6};

    // 使用emplace()插入新元素
    list1.emplace(list1.begin(), 0);
    for (int n : list1) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    // 使用splice()将list2的元素移到list1的末尾
    list1.splice(list1.end(), list2);
    for (int n : list1) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    // 使用merge()合并两个已排序的list
    std::list<int> sorted_list1 = {1, 3, 5};
    std::list<int> sorted_list2 = {2, 4, 6};
    sorted_list1.merge(sorted_list2);
    for (int n : sorted_list1) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    // 使用unique()去除相邻重复元素
    std::list<int> duplicates = {1, 1, 2, 3, 3, 4, 4, 4, 5};
    duplicates.unique();
    for (int n : duplicates) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    // 使用reverse()反转链表
    std::list<int> reverse_list = {1, 2, 3, 4, 5};
    reverse_list.reverse();
    for (int n : reverse_list) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    // 使用sort()对链表进行排序
    std::list<int> unsorted_list = {3, 1, 4, 1, 5, 9, 2, 6};
    unsorted_list.sort();
    for (int n : unsorted_list) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    return 0;
}

std::list的内部函数提供了强大的工具,用于高效管理和操作链表。通过emplace()splice()merge()unique()reverse()sort()等函数,我们可以在不需要额外开销的情况下,轻松实现元素的插入、移动、排序、去重和反转等功能。掌握这些函数的使用,将极大地提升我们在处理链表数据结构时的编程效率和代码质量。

四、std::liststd::vector的对比
  1. 内存布局
    • std::vector在内存中连续存储元素,适合随机访问。
    • std::list使用链式存储,不保证元素的物理连续性,不适合随机访问。
  2. 插入与删除
    • std::vector在非尾部插入或删除元素时,可能需要移动大量元素,效率较低。
    • std::list在任何位置插入或删除元素效率都很高,只需调整指针。
  3. 迭代器稳定性
    • std::vector中,插入或删除元素可能导致迭代器失效。
    • std::list的迭代器在插入或删除操作中通常不会失效,除非直接操作该迭代器指向的元素。
五、应用场景

std::list适用于需要频繁插入和删除元素的场景,如实现一个高效的缓存系统,其中元素的添加和移除非常频繁。此外,std::list在处理大型数据集时,由于其内存分配方式,可能会比std::vector更节省内存,尤其是在元素大小不固定的情况下。

结语

通过上述介绍和示例,我们可以看到std::list在特定场景下的强大功能。虽然它在随机访问方面不如std::vector,但在插入和删除操作上有着无可比拟的优势。理解并熟练掌握std::list的使用,将使你在面对具体编程任务时,能够做出更加合理的选择,从而编写出高效、优雅的代码。

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

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

相关文章

redis学习路线

待更新… 一、nosql讲解 1. 为什么要用nosql&#xff1f; 用户的个人信息&#xff0c;社交网络&#xff0c;地理位置&#xff0c;自己产生的数据&#xff0c;日志等等爆发式增长&#xff01;传统的关系型数据库已无法满足这些数据处理的要求&#xff0c;这时我们就需要使用N…

python-自幂数判断

[题目描述]&#xff1a; 自幂数是指&#xff0c;一个N 位数&#xff0c;满足各位数字N 次方之和是本身。例如&#xff0c;153153 是 33 位数&#xff0c;其每位数的 33 次方之和&#xff0c;135333153135333153&#xff0c;因此 153153 是自幂数&#xff1b;16341634 是 44 位数…

Swift 序列(Sequence)排序面面俱到 - 从过去到现在(一)

概览 在任何语言中对序列(或集合)元素的排序无疑是一种司空见惯的常规操作,在 Swift 语言里自然也不例外。序列排序看似简单,实则“暗藏玄机”。 要想真正掌握 Swift 语言中对排序的“各种姿势”,我们还得从长计议。不如就先从最简单的排序基本功开始聊起吧。 在本篇博…

OpenCv之简单的人脸识别项目(动态处理页面)

人脸识别 准备九、动态处理页面1.导入所需的包2.设置窗口2.1定义窗口外观和大小2.2设置窗口背景2.2.1设置背景图片2.2.2创建label控件 3.定义视频处理脚本4.定义相机抓取脚本5.定义关闭窗口的函数6.按钮设计6.1视频处理按钮6.2相机抓取按钮6.3返回按钮 7.定义关键函数8.动态处理…

Halcon 双相机标定与拼图(二)

一、概述 这种标定有两种模式&#xff0c;有一个标定板和多个标定板两种 一个标定板 两个相机的重叠区域比较大&#xff0c;那么我们可以把标定板放到那个重叠区域来统一坐标系&#xff0c;如下 这种是只需要一个标定板&#xff0c;这种是推荐的方式 。这种是比较简单的&…

Unity DOTS技术(十四) Job与ParallelJob接口

文章目录 一.创建方式如下图:二.开启Burst编译器三.创建多个Job四.数学运算介绍五.ParallelJob接口1.传统方式创建2.使用Parallel来实现对比3开启Burst编译器对比 这里介绍直接使用Job新的开启线程工作的方式. 一.创建方式如下图: 这里就开启了一个线程 二.开启Burst编译器 …

【机器学习】Softmax回归探索

从零开始探索Softmax回归&#xff1a;深度学习的入门之旅 一、Softmax回归的原理与关键步骤二、研究准备&#xff1a;GPU环境下的PyTorch安装与配置三、研究内容&#xff1a;使用PyTorch实现Softmax回归 随着人工智能和机器学习的迅猛发展&#xff0c;深度学习技术逐渐成为了科…

深度网络学习笔记(二)——Transformer架构详解(包括多头自注意力机制)

Transformer架构详解 前言Transformer的整体架构多头注意力机制&#xff08;Multi-Head Attention&#xff09;具体步骤1. 步骤12. 步骤23. 步骤34. 步骤4 Self-Attention应用与比较Self-Attention用于图像处理Self-Attention vs. CNNSelf-Attention vs. RNN Transformer架构详…

搭建数字化营销平台带来的一系列积极影响!

在当今数字化时代&#xff0c;搭建数字化营销平台具有一系列令人瞩目的积极影响。 这种平台的搭建&#xff0c;能够有力地促进形成良好的产业生态。就如同搭建蚓链数字化生态营销系统这般&#xff0c;它强化了产业间的沟通与协作&#xff0c;使得各个环节紧密相连&#xff…

【MMU】——MMU 权限控制

文章目录 权限控制内存访问权限内存类型XN execute neverDomain 权限控制 内存访问权限 内存类型 TEX C B bit 控制信息 XN execute never 不可执行区域&#xff0c;例如设备地址空间通常标记为不可执行区域&#xff0c;如果有指令预取访问了该空间&#xff0c;就会触发指令…

个人博客的未来出路在哪里?

说起个人博客的未来这就是个悲伤的话题,估计不少个人博客站长们都在苦苦的坚持和挣扎着吧,反正明月这两年感受最深刻的就是又有不少个人博客站点停更和 404 了都。自从坚持写博客这近十来年这种情况也都见怪不怪了,但这两年最突出的就是很多站长都是迷茫和悲观。 明月去年在…

地面站Mission planner

官方教程; Mission Planner地面站介绍 | Autopilot (gitbook.io) Mission Planner 功能/屏幕 — Mission Planner 文档 (ardupilot.org) 安卓或者windows软件下载地址&#xff1a; 地面站连接及使用 plane (cuav.net) 在完全装机后再进行各干器件的校准&#xff0c;没有组…

『 Linux 』目录与软硬链接 (万字详解)

文章目录 如何理解目录目录项 目录中的权限问题根目录Dentry缓存文件的增删改查与文件系统关系软硬链接软链接硬链接 如何理解目录 目录是一个文件存在其对应独立的Inode; $ stat dirFile: ‘dir’Size: 4096 Blocks: 8 IO Block: 4096 directory Device: f…

数据结构:一般哈希

数据结构&#xff1a;一般哈希 题目描述参考代码拉链法开放寻址法 题目描述 输入样例 5 I 1 I 2 I 3 Q 2 Q 5输出样例 Yes No参考代码 拉链法 #include <iostream> #include <cstring> using namespace std;const int N 100003;int h[N], e[N], ne[N], idx;vo…

docker实战命令大全

文章目录 1 环境准备1.1 移除旧版本Docker1.2安装工具包1.3配置docker yum源 2 安装最新docker2.1 设置开机自启docker2.2配置加速器 3 实操-镜像3.1搜索镜像3.2下载镜像3.3查看镜像3.4 删除镜像 4 实操-容器4.1运行nginx容器4.2 查看容器4.3启动容器4.5关闭容器4.6查看容器日志…

SpringAOP 常见应用场景

文章目录 SpringAOP1 概念2 常见应用场景3 AOP的几种通知类型分别有什么常见的应用场景4 AOP实现 性能监控4.1 首先&#xff0c;定义一个切面类&#xff0c;用于实现性能监控逻辑&#xff1a;4.2 定义自定义注解4.3 注解修饰监控的方法 5 AOP实现 API调用统计5.1 定义切面类&am…

2024年AI大模型训练数据白皮书作用

2024年AI大模型训练数据白皮书 在人工智能迅猛发展的今天&#xff0c;AI大模型的训练数据质量和管理成为影响其性能和应用效果的关键因素。《2024年AI大模型训练数据白皮书》为业内人士提供了一份详尽的指南&#xff0c;揭示了当前AI大模型训练数据的最新趋势、最佳实践以及未…

通州公司代理记账,以专业服务提升企业运营效率

我们为您提供“通州公司代理记账”的全面信息&#xff0c;作为一家专业的代理记账机构&#xff0c;我们的目标是为您的企业提供最优质的服务&#xff0c;帮助您更高效地管理财务。 代理记账是一项重要的商业活动&#xff0c;它不仅可以帮助企业节约时间和成本&#xff0c;而且…

逻辑这回事(三)----时序分析与时序优化

基本时序参数 图1.1 D触发器结构 图1.2 D触发器时序 时钟clk采样数据D时&#xff0c;Tsu表示数据前边沿距离时钟上升沿的时间&#xff0c;MicTsu表示时钟clk能够稳定采样数据D的所要求时间&#xff0c;Th表示数据后边沿距离时钟上升沿的时间&#xff0c;MicTh表示时钟clk采样…

使用 Elasticsearch 调用 OpenAI 函数

作者&#xff1a;来自 Elastic Ashish Tiwari 介绍 OpenAI 中的函数调用是指 AI 模型与外部函数或 API 交互的能力&#xff0c;使它们能够执行文本生成之外的任务。此功能使模型能够通过调用预定义函数来执行代码、从数据库检索信息、与外部服务交互等。 该模型根据用户提示智…