代码随想录八股训练营第三十四天| C++
前言
一、vector和list的区别?
1.1.存储方式:
1.2.随机访问:
1.3.插入和删除操作:
1.4.内存使用:
1.5.容量和大小:
1.6.迭代器类型:
1.7.用途:
二、vector 底层原理和扩容过程?
2.1.底层原理:
2.2. 扩容过程:
总结
前言
在C++ 编程中,选择合适的数据结构对于优化程序性能和资源使用至关重要。标准模板库(STL)提供了多种容器,其中 vector 和 list 是两种常用的序列容器,它们各自具有独特的特性和适用场景。了解这些容器的内部机制和性能特点,可以帮助开发者根据具体需求做出更合理的选择。
一、vector和list的区别?
在 C++ 中,vector 和 list 都是标准模板库(STL)中的序列容器,用于存储元素集合。它们的主要区别如下:
1.1.存储方式:
vector是一个动态数组,它在内存中连续存储元素。这意味着元素在内存中是紧密排列的,类似于数组。list是一个双向链表,每个元素由一个节点表示,节点之间通过指针连接。这种结构使得list在插入和删除操作中更加灵活。
1.2.随机访问:
vector支持随机访问,即可以通过下标直接访问任何元素,访问时间复杂度为 O(1)。list不支持随机访问,访问特定元素需要从头或尾开始遍历,直到到达所需元素,访问时间复杂度为 O(n)。
1.3.插入和删除操作:
vector在插入和删除元素时,如果需要移动内存中的元素来保持连续性,可能会有较高的开销。特别是当容器大小需要增长时,可能需要分配新的内存并复制现有元素。list在插入和删除元素时,只需要调整节点之间的指针,不需要移动其他元素,因此在这些操作上通常比vector更高效。
1.4.内存使用:
vector通常在内存使用上更紧凑,因为它是一个连续的存储块。list由于每个元素都需要额外的空间来存储指针(至少两个指针,指向前一个和后一个元素),因此内存使用上不如vector紧凑。
1.5.容量和大小:
vector维护了size(当前元素数量)和capacity(容器能够容纳的最大元素数量)两个概念。当size达到capacity时,vector会进行扩容操作。list没有capacity的概念,它可以根据需要动态增长,不需要像vector那样进行扩容。
1.6.迭代器类型:
vector的迭代器支持随机访问,可以进行复杂的迭代操作,如std::sort。list的迭代器是双向迭代器,只能进行顺序访问,不支持随机访问。
1.7.用途:
vector适合于需要频繁随机访问元素的场景,如数值计算、游戏开发中的动态数组等。list适合于需要频繁插入和删除元素的场景,如实现算法中的链表结构、维护一个有序的元素集合等。
二、vector 底层原理和扩容过程?
在 C++ 中,std::vector 是一种序列容器,它封装了动态大小的数组。以下是 std::vector 的一些底层原理和扩容过程:
2.1.底层原理:
-
动态数组:
vector内部使用一个连续的内存块来存储元素,这个内存块的大小可以通过capacity()方法获取。 -
迭代器:
vector提供了随机访问迭代器,这意味着你可以像使用普通数组一样通过下标访问元素。 -
内存管理:
vector负责管理其内部数组的内存分配和释放。当元素被添加到vector时,它会检查当前的容量是否足够。如果不够,它会进行扩容。 -
构造和析构:
vector会为每个元素调用构造函数,当元素被移除或vector被销毁时,会调用析构函数。
2.2. 扩容过程:
-
容量检查:当你尝试添加元素到
vector时,如果当前vector的size等于capacity,vector需要扩容。 -
分配新内存:
vector会分配一个新的内存块,通常这个新内存块的大小是当前容量的两倍,或者按照某个特定的增长策略。 -
复制元素:
vector会使用拷贝或移动构造函数将现有元素从旧内存块复制到新内存块。 -
释放旧内存:一旦所有元素都被成功复制到新内存块,
vector会释放旧内存块。 -
更新迭代器和指针:由于内存块的地址发生了变化,所有指向旧内存块的迭代器和指针都会失效。因此,任何在扩容前获取的迭代器都需要在扩容后重新获取。
-
性能考虑:扩容是一个昂贵的操作,因为它涉及到分配新内存、复制元素和释放旧内存。因此,频繁的扩容可能会导致性能问题。
-
手动控制:可以通过调用
reserve()方法来手动设置vector的容量,这样可以减少在添加元素时进行的扩容次数。 -
缩减容量:如果不再需要
vector的额外容量,可以调用shrink_to_fit()方法来请求减少vector的内存使用,但这不保证容量会减少,因为标准库实现可能会忽略这个请求。
总结
vector 和 list 作为 C++ STL 中的两种序列容器,它们在数据存储、访问方式、操作效率等方面有着显著的差异。vector 提供了类似动态数组的功能,支持快速的随机访问,适合于需要频繁访问元素的场景。而 list 实现了双向链表,提供了高效的插入和删除操作,尤其适合于元素频繁变动的情况。开发者应根据实际应用的需求,权衡两者的优缺点,选择最合适的容器类型,以实现最优的性能和资源利用。
相关文章:
代码随想录八股训练营第三十四天| C++
前言 一、vector和list的区别? 1.1.存储方式: 1.2.随机访问: 1.3.插入和删除操作: 1.4.内存使用: 1.5.容量和大小: 1.6.迭代器类型: 1.7.用途: 二、vector 底层原理和扩容过…...
《深入理解 Java 中的 this 关键字》
目录 一、this关键字的基本理解 二、this调用属性和方法 (一)一般情况 (二)特殊情况 三、this调用构造器 四、案例分析 (一)Account类 (二)Customer类 (三&…...
python文件自动分类(5)
完成了文件自动分类的操作后,我们一起来复习下: 首先,获取文件夹中所有文件名称,用 os.path.join() 函数拼接出要移动到的目标地址。然后,使用 os.path.exists() 函数判断目标文件夹是否存在,不存在用 os.m…...
【Unity-Lua】音乐播放器循环滚动播放音乐名
前言:Unity中UI节点 图1 如上所示,一开始本来是打算用ScrollView做的,觉得直接计算对应的文本位置就行,所以没用ScrollRect来做,可以忽略Scroll,Viewport这些名字。如下图:需要在一个背景Image…...
宏碁扩展Swift系列,推出四款全新AI笔记本电脑
Acer正在扩展其Swift笔记本产品线,推出四款新型号,每款都内置了AI功能。这些笔记本提供诸如Microsoft Copilot、Acer用户感应技术、Windows Studio效应、PurifiedVoice 2.0和PurifiedView等功能。其他功能还包括Wi-Fi 7和Bluetooth 5.4连接。 我们先来看…...
科研绘图系列:R语言差异基因四分图(Quad plot)
文章目录 介绍加载R包导入数据数据预处理画图参考介绍 四分图(Quad plot)是一种数据可视化技术,通常用于展示四个变量之间的关系。它由四个子图组成,每个子图都显示两个变量之间的关系。四分图的布局通常是2x2的网格,每个格子代表一个变量对的散点图。 在四分图中,通常…...
文字或图案点选坐标点返回
最近看到这篇文章中讲到极验图片验证码破解方案 https://blog.geetest.com/article/65aaaa944edc5ec343ba9f52efef0cdc 其中核心解决步骤如下,作者还贴心的贴出了CNN代码,真是用心良极: step 3:批量下载存储验证图片,…...
硬盘数据恢复软件TOP4榜单出炉,选对方法竟然如此重要
这年头,信息多得不得了,数据对我们来说太重要了。但是,不管是咱们自己还是公司,都可能碰上丢数据的倒霉事,特别是不小心把硬盘里的东西删了。数据一丢,不光可能亏钱,工作和生活也可能受影响。好…...
给自己复盘用的随想录笔记-栈与队列
用栈实现队列 难在出去 232. 用栈实现队列 - 力扣(LeetCode) class MyQueue {private Stack<Integer> A;private Stack<Integer> B;public MyQueue() {Anew Stack<>();Bnew Stack<>();}public void push(int x) {A.push(x);}pu…...
微信小程序跳转到另一个微信小程序
引用:http://www.xmdeal.com/mobanjiaocheng/254.html 第一种方法: wx.navigateToMiniProgram 官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/navigate/wx.navigateToMiniProgram.html wx.navigateToMiniProgram({appId…...
【知识图谱】4、LLM大模型结合neo4j图数据库实现AI问答的功能
昨天写了一篇文章,使用fastapi直接操作neo4j图数据库插入数据的例子, 本文实现LLM大模型结合neo4j图数据库实现AI问答功能。 废话不多说,先上代码 import gradio as gr from fastapi import FastAPI, HTTPException, Request from pydantic…...
《信息技术 云计算 边缘云通用技术要求》国家标准发布,九州未来参编
日前,2024年第17号国家标准公告发布,由全国信标委云计算标准工作组组织制定、九州未来作为行业专家单位参编的《信息技术 云计算 边缘云通用技术要求》国家标准正式获批发布。 边缘云作为云计算技术的有效补充和拓展,能够实现将云计算能力拓展…...
NTFS硬盘支持工具Paragon NTFS for Mac 15.4.44 中文破解版
Paragon NTFS for Mac 15.4.44 中文破解版是一个底层的文件系统驱动程序,专门开发用来弥合Windows和Mac OS X之间的不兼容性,通过在Mac OS X系统下提供对任何版本的NTFS文件系统完全的读写访问服务来弥合这种不兼容性。为您轻松解决Mac不能识别Windows NTFS文件难题…...
66-java 类型擦除
类型擦除是Java类型信息在运行时的一个特性,它发生在泛型类型被擦除成它们的原始类型后,以及在运行时,由于类型擦除,泛型信息不可用。 例如,以下两个泛型类型: List<String> list1 new ArrayList&…...
25考研人数预计下降?这一届考研有哪些新趋势?
2025年考研时间线: 2024年9月:公共课及各院校考试大纲公布; 2024年9月下旬:预报名; 2024年10月:正式报名; 2024年11月:线上/线下确认; 2024年12月中下旬:…...
比尔·盖茨对AI充满信心
The Verge与比尔盖茨进行了关于AI、错误信息和气候变化的对话。 比尔盖茨花费数十亿美元资助他认为将塑造未来的技术——从应对气候变化到消灭疾病。 盖茨在一部新的Netflix系列片《未来之路:比尔盖茨的境界》中深入探讨了这些话题。该系列于9月18日首播ÿ…...
Selenium 实现图片验证码识别
前言 在测试过程中,有的时候登录需要输入图片验证码。这时候使用Selenium进行自动化测试,怎么做图片验证码识别?本篇内容主要介绍使用Selenium、BufferedImage、Tesseract进行图片 验证码识别。 环境准备 jdk:1.8 tessdata&…...
基于云原生向量数据库 PieCloudVector 的 RAG 实践
近年来,人工智能生成内容(AIGC)已然成为最热门的话题之一。工业界出现了各种内容生成工具,能够跨多种模态产生多样化的内容。这些主流的模型能够取得卓越表现,归功于创新的算法、模型规模的大幅扩展,以及海…...
内存泄漏的影响
(1)内存泄漏是什么? 内存泄漏是指程序运行过程中分配的内存没有被正确释放,导致这部分内存无法再次使用,从而造成内存资源的浪费。内存泄漏可能会导致系统性能下降、程序崩溃或者消耗过多的系统资源;内存泄漏通常发生在动态分配的…...
shell变量扩展你知道多少?
1. shell变量扩展 我们知道,${var}的形式可以获取变量var的值,但其实还可以有更多花式玩法。其中~表示用户根目录其实属于 波浪线扩展,这比较常见,不展开介绍了。 下面的每种情况中,word 都要经过波浪线扩…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
