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

代码随想录八股训练营第三十四天| C++

前言

一、vector和list的区别?

1.1.存储方式:

1.2.随机访问:

1.3.插入和删除操作:

1.4.内存使用:

1.5.容量和大小:

1.6.迭代器类型:

1.7.用途:

二、vector 底层原理和扩容过程?

2.1.底层原理:

2.2. 扩容过程:

总结


前言

在C++ 编程中,选择合适的数据结构对于优化程序性能和资源使用至关重要。标准模板库(STL)提供了多种容器,其中 vectorlist 是两种常用的序列容器,它们各自具有独特的特性和适用场景。了解这些容器的内部机制和性能特点,可以帮助开发者根据具体需求做出更合理的选择。

一、vector和list的区别?

在 C++ 中,vectorlist 都是标准模板库(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 时,如果当前 vectorsize 等于 capacityvector 需要扩容。

  • 分配新内存vector 会分配一个新的内存块,通常这个新内存块的大小是当前容量的两倍,或者按照某个特定的增长策略。

  • 复制元素vector 会使用拷贝或移动构造函数将现有元素从旧内存块复制到新内存块。

  • 释放旧内存:一旦所有元素都被成功复制到新内存块,vector 会释放旧内存块。

  • 更新迭代器和指针:由于内存块的地址发生了变化,所有指向旧内存块的迭代器和指针都会失效。因此,任何在扩容前获取的迭代器都需要在扩容后重新获取。

  • 性能考虑:扩容是一个昂贵的操作,因为它涉及到分配新内存、复制元素和释放旧内存。因此,频繁的扩容可能会导致性能问题。

  • 手动控制:可以通过调用 reserve() 方法来手动设置 vector 的容量,这样可以减少在添加元素时进行的扩容次数。

  • 缩减容量:如果不再需要 vector 的额外容量,可以调用 shrink_to_fit() 方法来请求减少 vector 的内存使用,但这不保证容量会减少,因为标准库实现可能会忽略这个请求。


总结

vectorlist 作为 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. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 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…...

微信小程序跳转到另一个微信小程序

引用&#xff1a;http://www.xmdeal.com/mobanjiaocheng/254.html 第一种方法&#xff1a; wx.navigateToMiniProgram 官方文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/api/navigate/wx.navigateToMiniProgram.html wx.navigateToMiniProgram({appId…...

【知识图谱】4、LLM大模型结合neo4j图数据库实现AI问答的功能

昨天写了一篇文章&#xff0c;使用fastapi直接操作neo4j图数据库插入数据的例子&#xff0c; 本文实现LLM大模型结合neo4j图数据库实现AI问答功能。 废话不多说&#xff0c;先上代码 import gradio as gr from fastapi import FastAPI, HTTPException, Request from pydantic…...

《信息技术 云计算 边缘云通用技术要求》国家标准发布,九州未来参编

日前&#xff0c;2024年第17号国家标准公告发布&#xff0c;由全国信标委云计算标准工作组组织制定、九州未来作为行业专家单位参编的《信息技术 云计算 边缘云通用技术要求》国家标准正式获批发布。 边缘云作为云计算技术的有效补充和拓展&#xff0c;能够实现将云计算能力拓展…...

NTFS硬盘支持工具Paragon NTFS for Mac 15.4.44 中文破解版

Paragon NTFS for Mac 15.4.44 中文破解版是一个底层的文件系统驱动程序,专门开发用来弥合Windows和Mac OS X之间的不兼容性&#xff0c;通过在Mac OS X系统下提供对任何版本的NTFS文件系统完全的读写访问服务来弥合这种不兼容性。为您轻松解决Mac不能识别Windows NTFS文件难题…...

66-java 类型擦除

类型擦除是Java类型信息在运行时的一个特性&#xff0c;它发生在泛型类型被擦除成它们的原始类型后&#xff0c;以及在运行时&#xff0c;由于类型擦除&#xff0c;泛型信息不可用。 例如&#xff0c;以下两个泛型类型&#xff1a; List<String> list1 new ArrayList&…...

25考研人数预计下降?这一届考研有哪些新趋势?

2025年考研时间线&#xff1a; 2024年9月&#xff1a;公共课及各院校考试大纲公布&#xff1b; 2024年9月下旬&#xff1a;预报名&#xff1b; 2024年10月&#xff1a;正式报名&#xff1b; 2024年11月&#xff1a;线上/线下确认&#xff1b; 2024年12月中下旬&#xff1a…...

比尔·盖茨对AI充满信心

The Verge与比尔盖茨进行了关于AI、错误信息和气候变化的对话。 比尔盖茨花费数十亿美元资助他认为将塑造未来的技术——从应对气候变化到消灭疾病。 盖茨在一部新的Netflix系列片《未来之路&#xff1a;比尔盖茨的境界》中深入探讨了这些话题。该系列于9月18日首播&#xff…...

Selenium 实现图片验证码识别

前言 在测试过程中&#xff0c;有的时候登录需要输入图片验证码。这时候使用Selenium进行自动化测试&#xff0c;怎么做图片验证码识别&#xff1f;本篇内容主要介绍使用Selenium、BufferedImage、Tesseract进行图片 验证码识别。 环境准备 jdk&#xff1a;1.8 tessdata&…...

基于云原生向量数据库 PieCloudVector 的 RAG 实践

近年来&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;已然成为最热门的话题之一。工业界出现了各种内容生成工具&#xff0c;能够跨多种模态产生多样化的内容。这些主流的模型能够取得卓越表现&#xff0c;归功于创新的算法、模型规模的大幅扩展&#xff0c;以及海…...

内存泄漏的影响

(1)内存泄漏是什么&#xff1f; 内存泄漏是指程序运行过程中分配的内存没有被正确释放&#xff0c;导致这部分内存无法再次使用&#xff0c;从而造成内存资源的浪费。内存泄漏可能会导致系统性能下降、程序崩溃或者消耗过多的系统资源&#xff1b;内存泄漏通常发生在动态分配的…...

shell变量扩展你知道多少?

1. shell变量扩展 我们知道&#xff0c;${var}的形式可以获取变量var的值&#xff0c;但其实还可以有更多花式玩法。其中&#xff5e;表示用户根目录其实属于 波浪线扩展&#xff0c;这比较常见&#xff0c;不展开介绍了。 下面的每种情况中&#xff0c;word 都要经过波浪线扩…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...