std::list

news2024/10/10 11:24:04

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高

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

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

相关文章

网约巴士订票系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;巴士信息管理&#xff0c;积分兑换管理&#xff0c;积分纪录管理&#xff0c;新闻信息管理&#xff0c;基础数据管理 微信端账号功能包括&#xff1a;系统…

国产长芯微LDC8531低功耗轨到轨输出 16 位串行输入数模转换器完全P2P替代DAC8531

描述 LDC8531是一款低功耗、单16位缓冲电压输出数模转换器&#xff08;DAC&#xff09;。其片上精密输出放大器允许实现轨到轨输出摆动。LDC8531使用多功能三线串行接口&#xff0c;其时钟频率高达30MHz&#xff0c;与标准SPI、QSPI、Microwire和数字信号处理器&#xff08;DSP…

数据库迁移中的权限问题及解决方法——以Error 1142为例

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

无线领夹麦克风哪个降噪好?选购领夹麦克风需注意的五大隐藏风险

不知道大家有没有遇到这样一个情况&#xff0c;为什么有些视频或直播的声音听起来那么清晰&#xff0c;仿佛身临其境&#xff0c;而自己拍的视频却总是嘈杂不堪&#xff0c;尤其是在户外拍摄的时候&#xff0c;音频中更是充斥着各种各样的噪音。这种问题主要还是麦克风的原因所…

3dmax笔记-ALT X 透明度设置

1 降低max的模型的透明度 ALTX 看区别 区别对比

Sentinel最全笔记,详细使用步骤教程清单

一、Sentinel的基本功能 1、流量控制 流量控制在网络传输中是一个常用的概念&#xff0c;它用于调整网络包的发送数据。然而&#xff0c;从系统稳定性角度考虑&#xff0c;在处理请求的速度上&#xff0c;也有非常多的讲究。任意时间到来的请求往往是随机不可控的&#xff0c;…

分辨率提高4到8倍!AI高清修复工具-upscayl使用方法!

你还在为手中的模糊照片苦恼吗&#xff1f; 是不是想把老照片或低分辨率的图片用于大尺寸印刷&#xff0c;却因为画质糟糕而无从下手&#xff1f; 现在你不再需要高深的Photoshop技能&#xff0c;也不用花费巨资找人修图。借助AI高清修复工具Upscayl&#xff0c;只需几秒钟&am…

一文解读数据中台附搭建指南

数据是企业的核心资产&#xff0c;更是企业数字化转型的关键驱动力。为了更好地管理和利用数据&#xff0c;进行数据共享&#xff0c;充分发挥数据的作用&#xff0c;越来越多的企业开始构建实时数据中台。 一数据中台 定义&#xff1a;数据中台是将企业内部各个部门、系统、应…

【嵌入式软件-STM32】STM32简介

目录 一、STM32定义 二、STM32用途 三、STM32特点 四、STM32 四个系列 五、了解ARM 六、芯片解释 七、片上资源 八、命名规则 九、系统结构 内核 Flash DMA 外设种类和分布 十、引脚定义 类型 名称 引脚 十一、启动配置 十二、STM32最小系统电路 STM32及供电 供电引脚 滤波电容…

机器人动力学和轨迹规划

路径规划&#xff08;way&#xff09;&#xff1a;规划连接位置A与位置B间序列点或曲线的策略。 注意&#xff1a;这个路径规划是非常重要的&#xff0c;是机器人智能的一个体现。 路径规划主要有3个方法&#xff1a;MoveJ&#xff1a;关节点到点运动&#xff0c;MoveL&#…

Spring Boot学习资源库:Java开发者的新篇章

2 相关技术简介 2.1Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0c;任…

crossover和虚拟机哪个好用?Mac电脑玩游戏用哪个软件?

由于大多数热门游戏都是针对Windows平台开发的&#xff0c;这对于Mac用户来说可能会带来一些困扰。幸运的是&#xff0c;有几款虚拟机软件可以帮助解决这个问题&#xff0c;其中最常提到的是Parallels Desktop&#xff08;简称PD虚拟机&#xff09;和CrossOver。 PD虚拟机&…

Nodejs-Nestjs框架 RBAC(基于角色的访问控制模型) 微服务 仿小米商城实战视频教程-2024年-试看学习记录

文章目录 前提-安装环境Nestjs框架介绍Nestjs框架环境搭建创建nestjs项目运行nestjs项目demonestjs新项目结构解释nestjs中的控制器、路由、Get、Post、方法参数装饰器nestjs模板引擎、配置静态资源(了解即可)nestjs中的服务(Model)nestjs中的cookie(了解即可)nestjs中的se…

企业工作者如何提高对数据治理的认知度

提高对数据治理的认知度是一个涉及多方面努力的过程&#xff0c;以下是一些建议&#xff0c;可以帮助企业或个人增强对数据治理的理解和重视&#xff1a; 一、教育与培训 组织内部培训&#xff1a;定期举办数据治理相关的培训课程&#xff0c;邀请行业专家或内部资深人士进行…

AI用得好,升职加薪早

最近&#xff0c;K哥在公司里经常说的一句话就是&#xff1a;“AI用得好&#xff0c;升职加薪早&#xff01;” 而且我们团队每个人都增加了一条KPI&#xff0c;叫做“含AI量”。什么意思呢&#xff1f;就是完成一项工作&#xff0c;使用了多少AI工具。 我不仅这样要求团队&…

JS 数组去重 — 各类场景适合方法大全

JS 数组去重 — 各类场景适合方法大全 本文介绍各种场景 JS 去重 方法使用 性能最好、用的最多、场景大全 文章目录 JS 数组去重 — 各类场景适合方法大全 一、基础篇&#xff1a;简单直观的去重方法1. 使用Set数据结构2. 利用filter和indexOf方法3. reduce方法的应用 二、进阶…

国产长芯微LDC5422单通道、16位、电流源和电压输出DAC,HART连接完全P2P替代AD5422

描述 LDC5422是低成本、精密、完全集成、16位数模转换器(DAC)&#xff0c;内置可编程电流源和可编程电压输出&#xff0c;设计用于满足工业过程控制应用的需要。 输出电流范围可编程设置为4 mA至20 mA、0 mA至20 mA或者超量程的0 mA至24 mA。 此产品的LFCSP版本有一个CAP2引脚…

Linux运维_安全狗Apache版本安装

--------->安全狗官网(网站安全狗-网站安全防护,防后门|防SQL注入|防CC攻击|网马查杀|防篡改) 1.下载解压安全狗 2.

《Windows PE》4.3 延迟加载导入表

延迟加载导入表&#xff08;Delayed Import Table&#xff09;是PE文件中的一个数据结构&#xff0c;用于实现延迟加载&#xff08;Lazy Loading&#xff09;外部函数的机制。 延迟加载是指在程序运行时&#xff0c;只有当需要使用某个外部函数时才进行加载和绑定&#xff0c;…

【最新华为OD机试E卷-支持在线评测】最小的调整次数(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…