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

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标准库中的一个序列容器&#xff0c;它提供了双向链表的功能。std::list允许在序列的任何位置高效地插入和删除元素&#xff0c;而不会引起其他元素的移动&#xff0c;这使得std::list在需要频繁插入和删除操作的场景中非常有用。 std::list的特性&#xff1a; 双…...

opencv-rust 系列2: camera_calibration

opencv-rust 系列2: camera_calibration 前言: 这里只是opencv-rust自带示例的中文注解. 略微增加了一些代码也是我在调试时用到的. 说明: camera_calibration.rs是opencv-rust自带的示例, 在examples目录中可以找到,我增加了一些中文注释如下.如需运行可以在项目根目录执行命…...

JVM和GC案例详解

接上文JVM环境配置说明&#xff1a;上文博客 一、JVM远程连接设置 1. JMX方式连接(这种方式没有GC监控)&#xff0c;设置如下 2. 连接成功后可以查看基础配置参数(和服务器配置一致) 2. jstatd方式连接(这种方式没有CPU监控) 添加jstatd方式连接 双击Tomcat&#xff0…...

postgreSql下载安装

一、下载 官网&#xff1a;PostgreSQL: The worlds most advanced open source database 二、安装 1.找到.exe文件&#xff0c;双击安装 2.跟着安装向导操作 三、启动...

GPT-SOVIT模型部署指南

一、模型介绍 强大的小样本语音转换和文本转语音 WebUI。 具有以下特征&#xff1a; 零样本 TTS&#xff1a; 输入 5 秒的声音样本并体验即时文本到语音的转换。少量样本 TTS&#xff1a; 仅使用 1 分钟的训练数据对模型进行微调&#xff0c;以提高语音相似度和真实感。跨语…...

怎么定时发朋友圈?

要实现微信朋友圈的定时发布&#xff0c;可以采用以下几种方法&#xff1a; 1、 绑定QQ号并使用QQ空间定时功能&#xff1a; 于微信和QQ的紧密联系&#xff0c;可以通过绑定QQ号&#xff0c;利用QQ空间的定时发布功能来间接实现微信朋友圈的定时发布。首先&#xff0c;在QQ空…...

如何利用phpstudy创建mysql数据库

phpStudy诞生于2007年&#xff0c;是一款老牌知名的PHP开发集成环境工具&#xff0c;产品历经多次迭代升级&#xff0c;目前有phpStudy经典版、phpStudy V8&#xff08;2019版&#xff09;等等&#xff0c;利用phpstudy可以快速搭建一个mysql环境&#xff0c;接下来我们就开始吧…...

五、Linux之Vi和Vim编辑器

基本介绍 Vi Linux 系统会内置 vi 文本编辑 Vim 具有程序编辑的能力&#xff0c;可以看做是 Vi 的增强版本&#xff0c;可以主动的以字体颜色辨别语法的正确性&#xff0c;方便程序设计。 代码补完、编译及错误跳转等方便编程的功能特别丰富 常用的三种模式 正常模式 以 vim …...

git删除错误的commit

文章目录 1、git删除错误的commit2、.gitignore配置文件不生效的问题 1、git删除错误的commit git的流程如图&#xff1a; 当某次失误造成commit的版本有问题&#xff0c;需要回退到正常的版本修改后重新add。 首先通过git log查看commit提交记录&#xff0c;可以看到HEAD-…...

代码随想录算法训练营Day08 | 344.反转字符串、541. 反转字符串II、卡码网:54.替换数字

文章目录 344.反转字符串思路与重点 541. 反转字符串II思路与重点 卡码网&#xff1a;54.替换数字思路与重点 344.反转字符串 题目链接&#xff1a;344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09;讲解链接&#xff1a;代码随想录 (programmercarl.com)状态&#xff…...

mysql锁之乐观锁、悲观锁、表锁、行锁、共享锁、排他锁

mysql锁之乐观锁、悲观锁、表锁、行锁、共享锁、排他锁 MySQL锁概述 锁是计算机协调多个进程或线程并发访问某一个资源的机制&#xff0c;在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资…...

【软件干货】Android应用进程如何保活?

​1.Android 应用进程保活方法介绍 在Android应用程序中&#xff0c;为了保证应用的正常运行和稳定性&#xff0c;有时需要对应用进程进行保活。以下是一些实现进程保活的方法&#xff1a; 1、使用前台服务(Foreground Service)&#xff1a;将服务调用startForeground()方法&…...

neo4j部署保姆级教程

由于公司是基于大数据架构的&#xff0c;让部署neo4j数据库&#xff0c;之前没有接触过&#xff0c;然后紧急学了一下&#xff0c;并且从网上找了一些教程&#xff0c;决定还是记录下来&#xff0c;后续有时间了会在出一篇使用教程 环境准备&#xff08;root用户&#xff09; …...

【STM32CubeMX开发】-2.2-TIM_输出一个PWM信号

目录 1 Tim定时器的时钟源 2 Tim定时器的配置 2.1 PWM配置 2.2 中断配置 3 生成代码 4 测试结果 结尾 1 Tim定时器的时钟源 TIM3的时钟来源自APB1 Timer clocks&#xff0c;时钟树上所有总线频率均设置为了STM32F0能达到的最高频率&#xff0c;此时APB1 Timer clocks …...

Ngx+Lua+Redis 快速存储POST数据

系统几万台设备有windows有安卓还有linux系统&#xff0c;每个设备三分钟就会向服务器post设备的硬件信息&#xff0c;数据格式json&#xff0c;后台管理界面只需要最新的数据&#xff0c;不需要历史数据&#xff0c;业务逻辑非常简单&#xff0c;PHP代码就几行&#xff0c;已经…...

go-delve的使用

go-delve的非交互使用方式&#xff1a; dlv要执行的命令文件&#xff1a;cmd.dlv goroutines exit 执行非交互命令&#xff1a; yes n | dlv --allow-non-terminal-interactivetrue attach $pid --init cmd.dlv --end--...

Python网络爬虫技术详解

Python网络爬虫技术详解 引言 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;又称网络蜘蛛&#xff08;Web Spider&#xff09;或网络机器人&#xff08;Web Robot&#xff09;&#xff0c;是一种按照一定规则自动抓取互联网信息的程序或脚本。它们通过遍历网页链…...

Golang | Leetcode Golang题解之第474题一和零

题目&#xff1a; 题解&#xff1a; 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--…...

算法刷题技巧

算法题&#xff1a;https://leetcode.cn/studyplan/top-100-liked/ 哈希表 使用哈希表&#xff0c;增删改查的时间复杂度均为O(1)。何时使用哈希表&#xff1f; 在某个区域内查找一个已知元素&#xff0c;可以使用哈希表作为这个区域根据一个特征对元素进行分类&#xff0c;特征…...

BMS、EMS PCS 简介

1 储能系统的构成 完整的电化学储能系统主要由电池组、电池管理系统&#xff08;BMS&#xff09;、能量管理系统&#xff08;EMS&#xff09;、储能变流器&#xff08;PCS&#xff09;以及其他电气设备构成。 在储能系统中&#xff0c;电池组将状态信息反馈给电池管理系统BMS&…...

spug3发布项目

一、启动spug项目 1.spug代码仓库地址: spug: 开源运维平台&#xff1a;面向中小型企业设计的无 Agent的自动化运维平台&#xff0c;整合了主机管理、主机批量执行、主机在线终端、文件在线上传下载、应用发布、任务计划、配置中心、监控、报警等一系列功能。 - Gitee.com 注…...

鸿蒙HarmonyOS开发:应用权限的基本概念及如何申请应用权限详细介绍

文章目录 一、访问控制二、应用权限1、应用权限管控2、权限使用的基本原则3、授权方式4、权限等级 三、申请应用权限1、选择申请权限的方式2、声明权限3、声明样例4、二次向用户申请授权5、具体实现示例6、效果展示 四、应用权限列表1、system_grant&#xff08;系统授权&#…...

mac 桌面版docker no space left on device

报错信息 docker pull镜像时报&#xff1a; failed to register layer: Error processing tar file(exit status 1): write /home/admin/oceanbase_bak/bin/observer: no space left on device 解决 增加 docker 虚拟磁盘大小。 调整完点击重启即可。...

基于CIM的街镇基层治理统一指挥平台建设方案

1 项目概述 1.1 建设背景 社区作为人民生活的重要区域,往往需要对社区内人员、房屋、基本设施、日常业务进行规范管理,以保证其正常运行,但是传统的社区治理方式已不能满足新时代社会发展的要求,如人工采集录入信息、人员现场巡逻等,这些工作方式不仅工作量大,而且效率…...

PostgreSQL学习笔记三:数据类型和运算符

数据类型和运算符 PostgreSQL 支持多种数据类型和运算符&#xff0c;以下是一些常见的数据类型和运算符的概述&#xff1a; 数据类型 基本数据类型 整数类型&#xff1a; SMALLINT&#xff1a;2 字节&#xff0c;范围 -32,768 到 32,767。INTEGER&#xff1a;4 字节&#xff0…...

ROS理论与实践学习笔记——6 ROS机器人导航(仿真)

在 ROS 中&#xff0c;机器人导航&#xff08;Navigation&#xff09;是由多个功能包组合而成的系统&#xff0c;统称为导航功能包集&#xff08;navigation stack&#xff09;。它提供了一个全面的框架&#xff0c;使得移动机器人能够自主导航到指定目标点&#xff0c;同时避开…...

uniapp开发微信小程序,button的open-type=“share“ 分享给个人跳转到首页问题

当使用button标签带上open-type"share"属性&#xff0c;点击之后可分享当前页面给微信好友&#xff0c;但是分享之后朋友点开跳转到了首页问题。 需要使用 onShareAppMessage 函数 export default {onShareAppMessage(res) {if (res.from button) {// 来自页面内分…...

【jQuery】 jQuery基础及选择器介绍(基本选择器 层次选择器 属性选择器 过滤选择器)

文章目录 jQuery基础1. 优势2. 版本3. 基本语法4. 选择器基本选择器层次选择器属性选择器过滤选择器基本过滤选择器可见性过滤选择器 注意事项 jQuery基础 jQuery 是一个功能强大且易于使用的 JavaScript 库&#xff0c;它极大地简化了前端开发的工作。无论是 DOM 操作、事件处…...

网站在对抗机器人攻击的斗争中失败了

95% 的高级机器人攻击都未被发现&#xff0c;这一发现表明当前的检测和缓解策略存在缺陷。 这表明&#xff0c;虽然一些组织可能拥有基本的防御能力&#xff0c;但他们没有足够的能力应对更复杂的攻击。 例如利用人工智能和机器学习来模仿人类行为的攻击。 这些统计数据强调…...

Centos7 搭建logstash

下载并安装公共签名密钥&#xff1a; sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch 创建一个名为 /etc/yum.repos.d/logstash.repo 的文件&#xff0c;并添加以下内容&#xff1a; [logstash-7.x] nameElastic repository for 7.x packages baseu…...