std::list
std::list是C++标准库中的一个序列容器,它提供了双向链表的功能。std::list允许在序列的任何位置高效地插入和删除元素,而不会引起其他元素的移动,这使得std::list在需要频繁插入和删除操作的场景中非常有用。
std::list的特性:
- 双向链表:std::list存储的元素在内存中不是连续的,而是通过指针连接的节点
- 不保证元素顺序:与std::vector不同,std::list不保证元素的物理存储顺序与声明顺序相同
- 高效的插入和删除:可以在任意位置快速插入和删除元素(O(1)),而不需要移动其他元素;但由于其没有随机访问的能力,因此查找的速度较慢(O(n))
- 模板类:std::list是一个模板类,可以存储任何类型的数据
std::list有如下一些成员函数:
- std::list():默认构造一个空的链表;还可以拷贝构造和移动构造
- operator =:赋值操作,用于将一个链表的内容赋给另一个链表
- swap():交换两个链表的内容
- front():访问链表的第一个元素
- back():访问链表的最后一个元素
- insert(const_iterator pos, const T& value):在指定位置插入一个元素
- emplace(const_iterator pos, Args&&… args):在指定位置就地构造一个元素
- erase(const_iterator pos):删除指定位置的元素
- erase(const_iterator first, const_iterator last):删除指定范围内的元素
- push_back():末尾添加一个元素
- emplace_back():末尾就地构造一个元素
- push_front():表头添加一个元素
- emplace_front():表头就地构造一个元素
- pop_back():删除末尾元素
- pop_front():删除表头元素
- size():返回链表中元素的数量
- empty():检查链表是否为空
- sort():对链表中的元素进行排序,默认按升序排列
- reverse():反转链表中元素的顺序
- splice():将一个链表的元素移动到另一个链表
// 创建一个双向链表,并进行初始化
std::list<int> lst = { 1, 2, 3, 4, 5 };
for (auto value : lst) {std::cout << value << std::endl; // 1 2 3 4 5
}// 拷贝构造,深拷贝
std::list<int> new_lst1(lst);
for (auto value : new_lst1) {std::cout << value << std::endl; // 1 2 3 4 5
}
std::cout << lst.size() << std::endl; // 5// 移动构造
std::list<int> new_lst2(std::move(lst));
for (auto value : new_lst2) {std::cout << value << std::endl; // 1 2 3 4 5
}
std::cout << lst.size() << std::endl; // 0// 赋值操作
std::list<int> new_lst3{3, 2, 1, 4, 5, 6, 7};
lst = new_lst3;
for (auto value : lst) {std::cout << value << std::endl; // 3 2 1 4 5 6 7
}// 交换内容
lst.swap(new_lst1);
for (auto value : lst) {std::cout << value << std::endl; // 1 2 3 4 5
}
for (auto value : new_lst1) {std::cout << value << std::endl; // 3 2 1 4 5 6 7
}// 访问元素
std::cout << lst.front() << std::endl; // 访问第一个元素,1
std::cout << lst.back() << std::endl; // 访问最后一个元素,5// 插入元素
auto it = lst.begin(); // 获取迭代器,指向第一个元素
std::advance(it, 2); // 将迭代器前移两个元素,指向第三个元素
lst.insert(it, 6); // 在第三个元素位置插入新元素
for (auto value : lst) {std::cout << value << std::endl; // 1 2 6 3 4 5
}
std::cout << *it << std::endl; // 此时迭代器指向第四个元素3
lst.emplace(it, 7); // 就地构造一个元素插入
for (auto value : lst) {std::cout << value << std::endl; // 1 2 6 7 3 4 5
}// 删除元素
lst.erase(it); // 删除指定位置元素,此时迭代器指向第五个元素3
for (auto value : lst) {std::cout << value << std::endl; // 1 2 6 7 4 5
}
lst.erase(lst.begin(), lst.end()); // 删除指定范围的元素,左闭右开
std::cout << lst.size() << std::endl; // 0// 末尾添加元素
lst.push_back(8); // 末尾添加元素8
lst.push_back(9); // 末尾添加元素9
lst.emplace_back(10); // 就地构造末尾元素10
for (auto value : lst) {std::cout << value << std::endl; // 8 9 10
}// 末尾删除元素
lst.pop_back();
for (auto value : lst) {std::cout << value << std::endl; // 8 9
}// 表头添加元素
lst.push_front(7); // 表头添加元素7
lst.push_front(6); // 表头添加元素6
lst.emplace_front(5); // 就地构造表头元素5
for (auto value : lst) {std::cout << value << std::endl; // 5 6 7 8 9
}// 表头删除元素
lst.pop_front();
for (auto value : lst) {std::cout << value << std::endl; // 6 7 8 9
}// 排序
lst.push_back(4);
lst.push_back(1);
lst.sort(); // 默认按升序排列
for (auto value : lst) {std::cout << value << std::endl; // 1 4 6 7 8 9
}// 反转
lst.push_back(0);
lst.reverse(); // 反转元素顺序
for (auto value : lst) {std::cout << value << std::endl; // 0 9 8 7 6 4 1
}// 合并
lst.splice(lst.begin(), new_lst1); // 将new_lst1的元素合并到lst的第一个元素位置
for (auto value : lst) {std::cout << value << std::endl; // 3 2 1 4 5 6 7 0 9 8 7 6 4 1
}
std::list的优点:
- 高效的插入和删除:在任意位置插入和删除元素的时间复杂度为O(1)
- 内存利用率:没有内存浪费,因为不需要像std::vector那样预留空间
std::list的缺点:
- 访问效率低:不能像std::vector那样通过索引随机访问元素,访问特定元素可能需要O(n)的时间
- 内存开销:由于需要存储额外的指针,内存开销比std::vector高
相关文章:
std::list
std::list是C标准库中的一个序列容器,它提供了双向链表的功能。std::list允许在序列的任何位置高效地插入和删除元素,而不会引起其他元素的移动,这使得std::list在需要频繁插入和删除操作的场景中非常有用。 std::list的特性: 双…...
opencv-rust 系列2: camera_calibration
opencv-rust 系列2: camera_calibration 前言: 这里只是opencv-rust自带示例的中文注解. 略微增加了一些代码也是我在调试时用到的. 说明: camera_calibration.rs是opencv-rust自带的示例, 在examples目录中可以找到,我增加了一些中文注释如下.如需运行可以在项目根目录执行命…...
JVM和GC案例详解
接上文JVM环境配置说明:上文博客 一、JVM远程连接设置 1. JMX方式连接(这种方式没有GC监控),设置如下 2. 连接成功后可以查看基础配置参数(和服务器配置一致) 2. jstatd方式连接(这种方式没有CPU监控) 添加jstatd方式连接 双击Tomcat࿰…...
postgreSql下载安装
一、下载 官网:PostgreSQL: The worlds most advanced open source database 二、安装 1.找到.exe文件,双击安装 2.跟着安装向导操作 三、启动...
GPT-SOVIT模型部署指南
一、模型介绍 强大的小样本语音转换和文本转语音 WebUI。 具有以下特征: 零样本 TTS: 输入 5 秒的声音样本并体验即时文本到语音的转换。少量样本 TTS: 仅使用 1 分钟的训练数据对模型进行微调,以提高语音相似度和真实感。跨语…...
怎么定时发朋友圈?
要实现微信朋友圈的定时发布,可以采用以下几种方法: 1、 绑定QQ号并使用QQ空间定时功能: 于微信和QQ的紧密联系,可以通过绑定QQ号,利用QQ空间的定时发布功能来间接实现微信朋友圈的定时发布。首先,在QQ空…...
如何利用phpstudy创建mysql数据库
phpStudy诞生于2007年,是一款老牌知名的PHP开发集成环境工具,产品历经多次迭代升级,目前有phpStudy经典版、phpStudy V8(2019版)等等,利用phpstudy可以快速搭建一个mysql环境,接下来我们就开始吧…...
五、Linux之Vi和Vim编辑器
基本介绍 Vi Linux 系统会内置 vi 文本编辑 Vim 具有程序编辑的能力,可以看做是 Vi 的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计。 代码补完、编译及错误跳转等方便编程的功能特别丰富 常用的三种模式 正常模式 以 vim …...
git删除错误的commit
文章目录 1、git删除错误的commit2、.gitignore配置文件不生效的问题 1、git删除错误的commit git的流程如图: 当某次失误造成commit的版本有问题,需要回退到正常的版本修改后重新add。 首先通过git log查看commit提交记录,可以看到HEAD-…...
代码随想录算法训练营Day08 | 344.反转字符串、541. 反转字符串II、卡码网:54.替换数字
文章目录 344.反转字符串思路与重点 541. 反转字符串II思路与重点 卡码网:54.替换数字思路与重点 344.反转字符串 题目链接:344. 反转字符串 - 力扣(LeetCode)讲解链接:代码随想录 (programmercarl.com)状态ÿ…...
mysql锁之乐观锁、悲观锁、表锁、行锁、共享锁、排他锁
mysql锁之乐观锁、悲观锁、表锁、行锁、共享锁、排他锁 MySQL锁概述 锁是计算机协调多个进程或线程并发访问某一个资源的机制,在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资…...
【软件干货】Android应用进程如何保活?
1.Android 应用进程保活方法介绍 在Android应用程序中,为了保证应用的正常运行和稳定性,有时需要对应用进程进行保活。以下是一些实现进程保活的方法: 1、使用前台服务(Foreground Service):将服务调用startForeground()方法&…...
neo4j部署保姆级教程
由于公司是基于大数据架构的,让部署neo4j数据库,之前没有接触过,然后紧急学了一下,并且从网上找了一些教程,决定还是记录下来,后续有时间了会在出一篇使用教程 环境准备(root用户) …...
【STM32CubeMX开发】-2.2-TIM_输出一个PWM信号
目录 1 Tim定时器的时钟源 2 Tim定时器的配置 2.1 PWM配置 2.2 中断配置 3 生成代码 4 测试结果 结尾 1 Tim定时器的时钟源 TIM3的时钟来源自APB1 Timer clocks,时钟树上所有总线频率均设置为了STM32F0能达到的最高频率,此时APB1 Timer clocks …...
Ngx+Lua+Redis 快速存储POST数据
系统几万台设备有windows有安卓还有linux系统,每个设备三分钟就会向服务器post设备的硬件信息,数据格式json,后台管理界面只需要最新的数据,不需要历史数据,业务逻辑非常简单,PHP代码就几行,已经…...
go-delve的使用
go-delve的非交互使用方式: dlv要执行的命令文件:cmd.dlv goroutines exit 执行非交互命令: yes n | dlv --allow-non-terminal-interactivetrue attach $pid --init cmd.dlv --end--...
Python网络爬虫技术详解
Python网络爬虫技术详解 引言 网络爬虫(Web Crawler),又称网络蜘蛛(Web Spider)或网络机器人(Web Robot),是一种按照一定规则自动抓取互联网信息的程序或脚本。它们通过遍历网页链…...
Golang | Leetcode Golang题解之第474题一和零
题目: 题解: func findMaxForm(strs []string, m, n int) int {dp : make([][]int, m1)for i : range dp {dp[i] make([]int, n1)}for _, s : range strs {zeros : strings.Count(s, "0")ones : len(s) - zerosfor j : m; j > zeros; j--…...
算法刷题技巧
算法题:https://leetcode.cn/studyplan/top-100-liked/ 哈希表 使用哈希表,增删改查的时间复杂度均为O(1)。何时使用哈希表? 在某个区域内查找一个已知元素,可以使用哈希表作为这个区域根据一个特征对元素进行分类,特征…...
BMS、EMS PCS 简介
1 储能系统的构成 完整的电化学储能系统主要由电池组、电池管理系统(BMS)、能量管理系统(EMS)、储能变流器(PCS)以及其他电气设备构成。 在储能系统中,电池组将状态信息反馈给电池管理系统BMS&…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
