C++八股 —— vector底层

news2025/5/10 17:50:43

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.coloradmin.cn/o/2372499.html

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

相关文章

宁德时代区块链+数字孪生专利解析:去中心化身份认证重构产业安全底座

引言&#xff1a;当动力电池巨头瞄准数字孪生安全 2025年5月6日&#xff0c;金融界披露宁德时代未来能源&#xff08;上海&#xff09;研究院与母公司宁德时代新能源科技股份有限公司联合申请的一项关键专利——“身份验证方法、系统、电子设备及存储介质”。这项技术将区块链…

1.微服务概念

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

基于SSM实现的健身房系统功能实现八

一、前言介绍&#xff1a; 1.1 项目摘要 随着社会的快速发展和人们健康意识的不断提升&#xff0c;健身行业也在迅速扩展。越来越多的人加入到健身行列&#xff0c;健身房的数量也在不断增加。这种趋势使得健身房的管理变得越来越复杂&#xff0c;传统的手工或部分自动化的管…

Webug4.0靶场通关笔记24- 第29关Webshell爆破

目录 一、Webshell爆破原理分析 二、第29关webshell爆破渗透实战 1.环境搭建 2.打开靶场 3.暴力破解 &#xff08;1&#xff09;bp开启抓包模式 &#xff08;2&#xff09;输入密码12并抓包 &#xff08;3&#xff09;配置position &#xff08;4&#xff09;配置payl…

深入解析网络联通性检测:ping 与 tracert 的原理、用法及实战应用

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

LeetCode:101、对称二叉树

递归法&#xff1a; /*** 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) {…

从生产事故看软件质量保障:开发规范落实与时间资源矛盾的深度探讨

“穷则变&#xff0c;变则通&#xff0c;通则久。” —— 《周易系辞下》。在困境中要勇于变革&#xff0c;正如软件团队在遇到生产事故后&#xff0c;需要改变现有的开发方式和流程&#xff0c;以适应新的挑战。 在项目推进过程中&#xff0c;一场生产事故如晴天霹雳般袭来&am…

SAP note 3565626 : Baltimore CyberTrust 根证书即将过期

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

4.3 Thymeleaf案例演示:图书管理

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

STM32GPIO输入实战-key按键easy_button库移植

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

【递归、搜索和回溯】递归、搜索和回溯介绍及递归类算法例题

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

JDK8 HashMap红黑树退化为链表的机制解析

目录 1、数据结构&#xff1a; 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的根本原理 模型上下文协议&#xff08;MCP&#xff09;是一种标准化接口协议&#xff0c;旨在解决AI系统&#xff08;尤其是大型语言模型&#xff0c;LLM&#xff09;与外部工具、数据源之间的交互碎片化问题。其核心原理可以概括为以下三点&#xff1a; 统一接口抽象…

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

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

p2p虚拟服务器

ZeroTier Central ✅ 推荐工具&#xff1a;ZeroTier&#xff08;免费、稳定、跨平台&#xff09; ZeroTier 可以帮你把多台设备&#xff08;无论是否跨网&#xff09;加入一个虚拟局域网&#xff0c;彼此间可以像在同一个 LAN 中通信&#xff0c;UDP 视频、文件传输、SSH 等都…

python实现点餐系统

使用python实现点餐系统的增加菜品及价格&#xff0c;删除菜品&#xff0c;查询菜单&#xff0c;点菜以及会员折扣价等功能。 代码&#xff1a; 下面展示一些 内联代码片。 # 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流的使用步骤&#xff1a; 先得到一条Stream流&#xff08;流水线&#xff09;&#xff0c;并把数据放上去 使用中间方法对流水线上的数据进行操作 使用终结方法对流水线上的数据进行操作 Stream流的中间方法 注意1&#xff1a;中间方法&#xff0…

虚拟机ubantu20.04系统桥接模式下无法ping通外网,但可以ping通本机的解决方案

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

日常知识点之随手问题整理(思考单播,组播,广播哪个更省带宽)

新入职的公司在某些场景下无脑使用组播技术&#xff0c;自己突然就意识到一个问题&#xff1a;单播&#xff0c;组播&#xff0c;广播&#xff0c;哪个更省带宽&#xff1f; 有所收获&#xff0c;做点笔记&#xff0c;仅仅是个人理解~ 1&#xff1a;简单理解 单播&#xff1…