C++八股 —— vector底层

vector底层为动态数组

  1. 类构成

    • class vector : protected _Vector_base
    • _Vector_base:
      • _M_start:容器元素开始的位置
      • _M_finish:容器元素结束的位置
      • _M_end_of_storage:动态内存最后一个元素的下一个位置
  2. 构造函数

    • 无参构造

      根据性能优先规则,没有申请动态内存

    • 初始化元素个数的构造

      申请了动态内存,避免多次申请影响性能

  3. 插入元素

    先检查空间,不够则申请内存翻倍

    • 插入到最后
    • 插入到非最后:待插入位置之后的元素往后移一位,然后插入
  4. 删除元素

    删除元素不会释放已申请的内存

    • 删除最后:_M_finish往前移动一位
    • 删除非最后:待删除位置之后的元素往前移一位,然后执行“删除最后”操作
  5. 读取元素

    返回的是具体元素的引用

    • 操作符[]
    • at():比[]多一步越界检查操作
  6. 修改元素

    • 不支持直接修改某个位置的元素
    • 通过读取元素,获取引用,然后修改
    • 先删除后插入
  7. 释放空间

    • swap一个空容器
    • C++ 11:shrink_to_fit 将容器的空间收缩到容器大小。先clear()将容器清空(不会释放空间),然后收缩空间大小

参考:【C++面试题】vector底层实现原理_哔哩哔哩_bilibili


fill和assign
  1. std::fill(算法库函数)

    • 功能:将指定范围内的元素逐个赋值为给定值

    • 语法

      #include <algorithm>
      std::fill(iterator begin, iterator end, value);
      
    • 行为

      • 遍历 [begin, end) 范围内的元素,将每个元素赋值为 value
      • 不改变容器大小,仅修改已有元素的值。
    • 适用容器:所有支持迭代器的容器(如 vector, array, deque, 原生数组等)。

    • 优点

      • 高效:直接覆盖现有元素,无需重新分配内存。
      • 灵活性:可局部修改(例如只修改某一部分元素)。
    • 缺点:需要确保目标范围有效(例如不越界)。

示例

std::vector<int> vec = {1, 2, 3, 4};
std::fill(vec.begin(), vec.end(), 0); // vec → {0, 0, 0, 0}
std::fill(vec.begin() + 1, vec.end() - 1, 5); // vec → {0, 5, 5, 0}
  1. assign(容器成员函数)

    • 功能替换容器的内容,可以指定新元素的数量和值,或从其他容器/迭代器复制数据。

    • 语法

      // 用 n 个 value 替换容器内容
      container.assign(n, value);// 用迭代器范围 [begin, end) 替换容器内容
      container.assign(begin, end);
      
    • 行为

      • 销毁原有元素,重新分配内存(可能触发内存重新申请)。
      • 新内容可以是重复值或来自其他容器。
    • 适用容器:支持动态修改的序列容器(如 vector, deque, list, string)。

    • 优点

      • 简洁性:一行代码即可替换整个容器的内容。
      • 灵活性:支持从不同数据源(如另一个容器或初始化列表)赋值。
    • 缺点

      • 潜在性能开销:若新内容大小与原有内容不同,可能触发内存重分配。
      • 数据丢失:原有内容被完全覆盖。

示例

std::vector<int> vec = {1, 2, 3, 4};
vec.assign(3, 10);       // vec → {10, 10, 10}(大小变为 3)
vec.assign({5, 6, 7});   // vec → {5, 6, 7}(用初始化列表替换)
  1. 关键区别
特性std::fillassign
作用范围修改指定范围内的已有元素替换整个容器的内容
内存操作不改变容器大小,无内存分配可能触发内存重新分配
性能高效(直接覆盖)可能低效(若大小变化)
适用场景局部修改或保持容器大小不变时需要完全替换内容或调整大小时
代码简洁性需要显式指定范围一行代码替换全部内容
  1. 如何选择
  • 使用 std::fill
    • 需要保留容器原有结构(如大小不变)。
    • 仅需修改部分或全部元素的值(例如重置为默认值)。
    • 避免内存重分配(对性能敏感的场景)。
  • 使用 assign
    • 需要完全替换容器内容(例如用新数据覆盖旧数据)。
    • 需要调整容器大小(例如从 n 个元素变为 m 个元素)。
    • 从其他容器或初始化列表快速赋值。

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

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

相关文章

LLM量化方法:ZeroQuant、LLM.int8()、SmoothQuant、GPTQ、AWQ

文章目录 TLDR;量化分类量化时机量化粒度ZeroQuant: Efficient and Affordable Post-Training Quantization for Large-Scale Transformers细粒度硬件感知量化低成本逐层知识蒸馏&#xff08;Layer-by-layer Knowledge Distillation, LKD&#xff09; LLM.int8(): 8-bit Matrix…

SIGIR 2025端到端生成式推荐ETEGRec

文章目录 1. 背景2. 方法2.1 框架图2.2 问题定义2.3 Item Tokenizer2.4 Generative Recommender2.5 ⭐️Sequence-Item Alignment2.6 ⭐️Preference-Semantic Alignment2.7 交替优化 3. 总结 现阶段 GRM 大多是两阶段的模型&#xff0c;第一阶段进行内容理解-行为语义对齐&…

STM32CubeMX安装及使用分享

说是教程&#xff0c;属实是不敢当&#xff0c;只是把自己觉得较为正式的方式分享给各位&#xff0c;如有问题请提出大家一起讨论。 文章目录 软件下载软件安装软件使用开发板工程单片机工程单片机工程创建单片机工程配置界面单片机工程具体配置引脚功能配置系统时钟配置工程配…

MySQL报错解决过程

我在调试datagrip的时候&#xff0c;显示拒绝连接&#xff0c;开始的时候&#xff0c;我以为只是服务没有开启&#xff0c;结果到后来在网上搜索各种解决办法无果后&#xff0c;就选择卸载&#xff0c;卸载之后安装新的MySQL 以下就是我的解决过程。 如果只是在使用外置软件&…

动态规划-62.不同路径-力扣(LeetCode)

一、题目解析 机器人只能向下或向左&#xff0c;要从Start位置到Finish位置。 二、算法原理 1.状态表示 我们要求到Finish位置一共有多少种方法&#xff0c;记Finish为[i,j]&#xff0c;此时dp[i,j]表示&#xff1a;到[i,j]位置时&#xff0c;一共有多少种方法&#xff0c;满…

Qt开发:项目视图(Item Views)的介绍和使用

文章目录 一、清单视图&#xff08;List View&#xff09;1.1 基本概念1.2 使用示例&#xff08;文字列表&#xff09;1.3 图标文字&#xff08;图标模式&#xff09;1.4 常用设置1.5 完整示例 二、树视图&#xff08;Tree View&#xff09;2.1 基本概念2.2 常用类简介2.3 快速…

GoWeb开发(基础)

Go&#xff08;Golang&#xff09;是一种高效、简洁的编程语言&#xff0c;特别适合Web开发。以下是详细的Go Web开发指南&#xff0c;涵盖从基础到进阶的内容。 --- 一、Go Web开发基础 1. 标准库 net/http Go 内置 net/http 包&#xff0c;支持快速构建 Web 服务。 - 基本示…

GSENSE2020BSI sCMOS科学级相机主要参数及应用场景

GSENSE2020BSI sCMOS科学级相机是一款面向宽光谱成像需求的高性能科学成像设备&#xff0c;结合了背照式&#xff08;Back-Side Illuminated, BSI&#xff09;CMOS技术与先进信号处理算法&#xff0c;适用于天文观测、生物医学成像、工业检测等领域。以下是其核心特点及技术细节…

【日撸 Java 三百行】Day 9(While语句)

目录 Day 9&#xff1a;While 语句的基本使用方法 一、基础知识及案例分析 二、代码及测试 拓展&#xff1a;流程控制语句专题补充 小结 Day 9&#xff1a;While 语句的基本使用方法 Task&#xff1a; while 语句本质上比 for 更基础, 因此可以替代后者. 但 for 在很多时候…

React 第三十七节 Router 中 useOutlet Hook的使用介绍以及注意事项

React Router 中的 useOutlet 是 v6 版本新增的 Hook&#xff0c;用于在父路由组件中访问当前嵌套的子路由元素。它提供了比 <Outlet> 组件更灵活的控制方式&#xff0c;适合需要根据子路由状态进行动态处理的场景。 一、useOutlet的基本用法 import { useOutlet } fro…

TDengine 在智慧油田领域的应用

简介 智慧油田&#xff0c;亦称为数字油田或智能油田&#xff0c;是一种采用尖端信息技术与先进装备的现代油田开发模式。该模式通过实时更新油气田层析图及动态生产数据&#xff0c;显著提高了油气田的开发效率与经济价值。 信息技术在此领域发挥着至关重要的作用&#xff0…

关于AI 大数据模型的基础知识 杂记

一、LM Studio LM Studio下载地址&#xff1a;LM Studio - Discover, download, and run local LLMshttps://lmstudio.ai/LM Studio是使用electron架构&#xff0c;引用的llama.cpp库。 下载后的模型存储于 /User/Admin/.lmstudio/models中。 二、llama.cpp库下载地址 llam…

2025数维杯数学建模竞赛B题完整参考论文(共38页)(含模型、代码、数据)

2025数维杯数学建模竞赛B题完整参考论文 目录 摘要 一、问题重述 二、问题分析 三、模型假设 四、定义与符号说明 五、 模型建立与求解 5.1问题1 5.1.1问题1思路分析 5.1.2问题1模型建立 5.1.3问题1求解结果 5.2问题2 5.2.1问题2思路分析 5.2.2问题2…

利用GPT实现油猴脚本—网页滚动(优化版)

在浏览网页的时候&#xff0c;发现有的网页没有直达最前这样的功能&#xff0c;所有心血来潮利用ChatGPT写了一个油猴脚本以实现此功能&#xff0c;在网站上出现一个可以自由拖动的滑块。 声明&#xff1a;引用或二创需注明出处。 如图&#xff1a; 点击即可直达当前网页最前、…

MySQL基础关键_013_常用 DBA 命令

目 录 一、MySQL 用户信息存储位置 二、新建用户 1.创建本地用户 2.创建外网用户 三、用户授权 1.说明 2.实例 四、撤销授权 五、修改用户密码 六、修改用户名、主机名/IP地址 七、删除用户 八、数据备份 1.导出数据 2.导入数据 &#xff08;1&#xff09;方式…

计算机视觉与深度学习 | 图像匹配算法综述

图像匹配算法综述 图像匹配 图像匹配算法综述一、算法分类二、经典算法原理与公式1. **SIFT (Scale-Invariant Feature Transform)**2. **ORB (Oriented FAST and Rotated BRIEF)**3. **模板匹配(归一化互相关,NCC)**4. **SuperPoint(深度学习)**三、代码示例1. **SIFT 特…

切比雪夫不等式详解

切比雪夫不等式详解 一、引言 切比雪夫不等式&#xff08;Chebyshev’s Inequality&#xff09;是概率论和统计学中最重要的基本定理之一&#xff0c;由俄国数学家切比雪夫&#xff08;P. L. Chebyshev&#xff0c;1821-1894&#xff09;提出。它为我们提供了一个强大工具&am…

霸王茶姬微信小程序自动化签到系统完整实现解析

霸王茶姬微信小程序自动化签到系统完整实现解析 技术栈&#xff1a;Node.js 微信小程序API MD5动态签名 一、脚本全景架构 功能模块图 #mermaid-svg-0vx5W2xo0IZWn6mH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-s…

气动带刮刀硬密封固定式对夹球阀:专为高粘度、强腐蚀性介质设计的工业解决方案-耀圣

气动带刮刀硬密封固定式对夹球阀&#xff1a;专为高粘度、强腐蚀性介质设计的工业解决方案 在石油化工、锂电材料、污水处理等高难度工况中&#xff0c;带颗粒的高粘度介质、料浆及强腐蚀性流体对阀门的性能提出了严苛要求。 气动带刮刀硬密封固定式对夹球阀凭借其独特的结构…

Filecoin存储管理:如何停止Lotus向特定存储路径写入新扇区数据

Filecoin存储管理&#xff1a;如何停止Lotus向特定存储路径写入新扇区数据 引言背景问题场景解决方案步骤1&#xff1a;修改sectorstore.json文件步骤2&#xff1a;重新加载存储配置步骤3&#xff1a;验证更改 技术原理替代方案最佳实践结论 引言 在Filecoin挖矿过程中&#x…