C++八股 —— vector底层
vector底层为动态数组
-
类构成
class vector : protected _Vector_base
_Vector_base
:_M_start
:容器元素开始的位置_M_finish
:容器元素结束的位置_M_end_of_storage
:动态内存最后一个元素的下一个位置
-
构造函数
-
无参构造
根据性能优先规则,没有申请动态内存
-
初始化元素个数的构造
申请了动态内存,避免多次申请影响性能
-
-
插入元素
先检查空间,不够则申请内存翻倍
- 插入到最后
- 插入到非最后:待插入位置之后的元素往后移一位,然后插入
-
删除元素
删除元素不会释放已申请的内存
- 删除最后:
_M_finish
往前移动一位 - 删除非最后:待删除位置之后的元素往前移一位,然后执行“删除最后”操作
- 删除最后:
-
读取元素
返回的是具体元素的引用
- 操作符
[]
at()
:比[]
多一步越界检查操作
- 操作符
-
修改元素
- 不支持直接修改某个位置的元素
- 通过读取元素,获取引用,然后修改
- 先删除后插入
-
释放空间
swap
一个空容器- C++ 11:
shrink_to_fit
将容器的空间收缩到容器大小。先clear()
将容器清空(不会释放空间),然后收缩空间大小
参考:【C++面试题】vector底层实现原理_哔哩哔哩_bilibili
fill和assign
-
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}
-
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}(用初始化列表替换)
- 关键区别
特性 | std::fill | assign |
---|---|---|
作用范围 | 修改指定范围内的已有元素 | 替换整个容器的内容 |
内存操作 | 不改变容器大小,无内存分配 | 可能触发内存重新分配 |
性能 | 高效(直接覆盖) | 可能低效(若大小变化) |
适用场景 | 局部修改或保持容器大小不变时 | 需要完全替换内容或调整大小时 |
代码简洁性 | 需要显式指定范围 | 一行代码替换全部内容 |
- 如何选择
- 使用
std::fill
当:- 需要保留容器原有结构(如大小不变)。
- 仅需修改部分或全部元素的值(例如重置为默认值)。
- 避免内存重分配(对性能敏感的场景)。
- 使用
assign
当:- 需要完全替换容器内容(例如用新数据覆盖旧数据)。
- 需要调整容器大小(例如从
n
个元素变为m
个元素)。 - 从其他容器或初始化列表快速赋值。
相关文章:
C++八股 —— vector底层
vector底层为动态数组 类构成 class vector : protected _Vector_base_Vector_base: _M_start:容器元素开始的位置_M_finish:容器元素结束的位置_M_end_of_storage:动态内存最后一个元素的下一个位置 构造函数 无参构造 根据性能优先规则&a…...

宁德时代区块链+数字孪生专利解析:去中心化身份认证重构产业安全底座
引言:当动力电池巨头瞄准数字孪生安全 2025年5月6日,金融界披露宁德时代未来能源(上海)研究院与母公司宁德时代新能源科技股份有限公司联合申请的一项关键专利——“身份验证方法、系统、电子设备及存储介质”。这项技术将区块链…...

1.微服务概念
1.单体、分布式、集群 先理解单体、集群、分布式这些概念 1.单体 一个系统业务量很小的时候,所有的代码都放在一个项目中,然后这个项目部署在一台服务器上就好了。整个项目所有的服务都由这台服务器提供。这就是单机结构. 1.1 优点 单体应用开发简单,部署测试简单 …...

基于SSM实现的健身房系统功能实现八
一、前言介绍: 1.1 项目摘要 随着社会的快速发展和人们健康意识的不断提升,健身行业也在迅速扩展。越来越多的人加入到健身行列,健身房的数量也在不断增加。这种趋势使得健身房的管理变得越来越复杂,传统的手工或部分自动化的管…...
Spring Boot配置文件详解:从入门到精通
一、Spring Boot配置文件概述 Spring Boot配置文件是应用程序的核心配置管理工具,它允许开发者在不修改代码的情况下调整应用行为。配置文件主要有两种格式: 文件类型优点缺点适用场景application.properties简单直观,键值对形式不支持复杂…...

Webug4.0靶场通关笔记24- 第29关Webshell爆破
目录 一、Webshell爆破原理分析 二、第29关webshell爆破渗透实战 1.环境搭建 2.打开靶场 3.暴力破解 (1)bp开启抓包模式 (2)输入密码12并抓包 (3)配置position (4)配置payl…...
CMA认证对象?CMA评审依据,CMA认证好处
CMA认证对象 CMA(中国计量认证,China Metrology Accreditation)的认证对象主要是第三方检测机构和实验室,包括: 独立检测机构:如环境监测站、产品质量检验所、食品药品检测机构等。 企业内部实验室&#…...
在 MyBatis 中实现控制台输出 SQL 参数
在 MyBatis 中实现控制台输出 SQL 参数,可通过以下方案实现: # 一、使用 MyBatis-Plus 的 SqlLogInterceptor(推荐) 适用场景:项目已集成 MyBatis-Plus(3.5.3版本) 配置步骤ÿ…...

深入解析网络联通性检测:ping 与 tracert 的原理、用法及实战应用
深入解析网络联通性检测:ping 与 tracert 的原理、用法及实战应用 在网络世界中,确保设备之间的联通性是一切网络服务正常运行的基础。无论是网络工程师排查故障,还是普通用户检查网络连接,ping和tracert(在 Windows …...

LeetCode:101、对称二叉树
递归法: /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {…...

从生产事故看软件质量保障:开发规范落实与时间资源矛盾的深度探讨
“穷则变,变则通,通则久。” —— 《周易系辞下》。在困境中要勇于变革,正如软件团队在遇到生产事故后,需要改变现有的开发方式和流程,以适应新的挑战。 在项目推进过程中,一场生产事故如晴天霹雳般袭来&am…...
Redis 常见数据类型
Redis 常见数据类型 一、基本全局命令详解与实操 1. KEYS 命令 功能:按模式匹配返回所有符合条件的键(生产环境慎用,可能导致阻塞)。 语法: KEYS pattern 模式规则: h?llo:匹配 hello, ha…...
TextRNN 模型实现微博文本情感分类
在自然语言处理(NLP)领域,文本情感分类是一项极具应用价值的任务。它能帮助企业分析用户反馈、社交媒体舆情监测等。本文将通过一段实际代码,带大家了解如何利用 PyTorch 框架和 TextRNN 模型,完成微博文本的情感分类工…...

SAP note 3565626 : Baltimore CyberTrust 根证书即将过期
SAP note 3565626 : Baltimore CyberTrust 根证书即将过期 20250512 2025年5月9日 症状 您已收到来⾃ SAP Integration Suite/Cloud Integration 服务的通知邮件, 建议 Baltimore CyberTrust 根证书将于 2025 年 5 ⽉ 12 ⽇ 过期,其中 Balt…...

4.3 Thymeleaf案例演示:图书管理
本项目通过整合 Thymeleaf 实现了一个简单的图书管理系统。系统功能包括查询所有图书、按条件查询图书、根据用户角色显示按钮以及借阅图书。通过 Spring Boot 框架搭建项目,创建了用户和图书的实体类,以及图书的数据访问类和控制器。在 Thymeleaf 模板中…...

STM32GPIO输入实战-key按键easy_button库移植
STM32GPIO输入实战-key按键easy_button库移植 一,ebtn介绍二,ebtn移植三,组件库的思想组成1. 事件驱动 (Event-Driven) 🛎️ —— 像按门铃2. 状态机 (State Machine) 🚦 —— 像红绿灯3. 回调函数 (Callback Function…...

【递归、搜索和回溯】递归、搜索和回溯介绍及递归类算法例题
个人主页 : zxctscl 专栏 【C】、 【C语言】、 【Linux】、 【数据结构】、 【算法】 如有转载请先通知 文章目录 递归、搜索和回溯递归搜索VS 深度优先遍历 VS 深度优先搜索 VS 宽度优先遍历 VS 宽度优先搜索 VS 暴搜回溯与剪枝 1 面试题 08.06. 汉诺塔问题1.1 分析…...

JDK8 HashMap红黑树退化为链表的机制解析
目录 1、数据结构: 2、Fail-Fast机制 2.1、核心作用 2.2、实现原理 2.3、触发场景 2.4、实现细节 2.5、对比 2.6、注意事项 3、核心结论 4、转化安全机制 4.1. 触发场景 4.2. 转换过程 4.3. 并发安全机制 5、设计原因 5.1. 性能权衡 5.2. 空间局部性…...

【基础】模型上下文协议(Model Context Protocol, MCP)根本原理与工作机制详解
一、MCP的根本原理 模型上下文协议(MCP)是一种标准化接口协议,旨在解决AI系统(尤其是大型语言模型,LLM)与外部工具、数据源之间的交互碎片化问题。其核心原理可以概括为以下三点: 统一接口抽象…...

霸王茶姬微信小程序自动化签到系统完整实现解析
霸王茶姬微信小程序自动化签到系统完整实现解析 技术栈:Node.js 微信小程序API MD5动态签名 一、脚本全景架构 功能模块图 #mermaid-svg-0vx5W2xo0IZWn6mH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-s…...
北斗导航 | RTKLib中重难点技术,公式,代码
Rtklib 一、抗差自适应卡尔曼滤波1. **核心难点**2. **公式与代码实现**二、模糊度固定与LAMBDA算法1. **核心难点**2. **LAMBDA算法实现**3. **部分模糊度固定技术**三、伪距单点定位与误差修正1. **多系统多频点修正**2. **接收机钟差与系统间偏差**四、动态模型与周跳处理1.…...

p2p虚拟服务器
ZeroTier Central ✅ 推荐工具:ZeroTier(免费、稳定、跨平台) ZeroTier 可以帮你把多台设备(无论是否跨网)加入一个虚拟局域网,彼此间可以像在同一个 LAN 中通信,UDP 视频、文件传输、SSH 等都…...
Python 爬虫基础入门教程(超详细)
一、什么是爬虫? 网络爬虫(Web Crawler),又称网页蜘蛛,是一种自动抓取互联网信息的程序。爬虫会模拟人的浏览行为,向网站发送请求,然后获取网页内容并提取有用的数据。 二、Python爬虫的基本原…...

python实现点餐系统
使用python实现点餐系统的增加菜品及价格,删除菜品,查询菜单,点菜以及会员折扣价等功能。 代码: 下面展示一些 内联代码片。 # coding utf-8menu {拍黄瓜: 6, 小炒肉: 28, 西红柿炒蛋: 18, 烤鱼: 30, 红烧肉: 38, 手撕鸡: 45,…...

(三)毛子整洁架构(Infrastructure层/DapperHelper/乐观锁)
文章目录 项目地址一、Infrastructure Layer1.1 创建Application层需要的服务1. Clock服务2. Email 服务3. 注册服务 1.2 数据库服务1. 表配置Configurations2. Respository实现3. 数据库链接Factory实现4. Dapper的DataOnly服务实现5. 所有数据库服务注册 1.3 基于RowVersion的…...

探索Stream流:高效数据处理的秘密武器
不可变集合 stream流 Stream流的使用步骤: 先得到一条Stream流(流水线),并把数据放上去 使用中间方法对流水线上的数据进行操作 使用终结方法对流水线上的数据进行操作 Stream流的中间方法 注意1:中间方法࿰…...
git高效杀器——cz-customizable 搭配 commitlint
What is cz-customizable and commitlint? cz-customizable 一款可定制化的Commitizen插件(也可作为独立工具),旨在帮助创建如约定式提交规范的一致性提交消息。commitlint commitlint 是一个用于检查 Git 提交信息的工具,它可以帮助开发者保持提交信息的规范性和一致性。…...

虚拟机ubantu20.04系统桥接模式下无法ping通外网,但可以ping通本机的解决方案
1.出现的问题: 虚拟机ubantu20.04系统桥接模式下无法ping通外网,但可以ping通本机。 2.解决方案: 如果 DHCP 未分配 IP 地址,可以手动配置静态 IP: 1.编辑网络配置文件: sudo nano /etc/netplan/01-netcfg.yaml 2…...

日常知识点之随手问题整理(思考单播,组播,广播哪个更省带宽)
新入职的公司在某些场景下无脑使用组播技术,自己突然就意识到一个问题:单播,组播,广播,哪个更省带宽? 有所收获,做点笔记,仅仅是个人理解~ 1:简单理解 单播࿱…...

qtcreater配置opencv
我配置opencv不管是按照网上的教程还是deep seek发现都有些问题,下面是我的配置方法以及实践成功的心得 电脑环境 windows平台qt6 下载 我这里直接提供官网下载地址:https://opencv.org/releases/ 我下载的是最新版,下载后是一个.exe文件…...