STL工程问题

文章目录

  • 1. vector迭代器失效问题
    • 1.1. 情况1:扩容导致迭代器失效
    • 1.2. 情况2:删除导致迭代器失效
    • 1.3. 情况3:尾删导致迭代器失效
  • 2. STL怎么做内存管理
  • 3. 如何解决哈希冲突?
  • 4. vector手动释放内存问题
  • 5. 对象池思想

1. vector迭代器失效问题

  • 迭代器失效,其实就是迭代器底层的指针所指向的内存空间被销毁,而访问已经被释放的内存空间会导致程序崩溃

1.1. 情况1:扩容导致迭代器失效

  • 底层空间改变的函数:
    • resize() 改变容器大小
    • reserve() 预留容器存储空间
    • insert() 插入元素
    • assign() 用新元素替换现有元素
    • push_back() \ emplace_back() 尾插元素等。
  • 原因:异地扩容后,原本的内存空间被释放,但迭代器仍指向被释放的内存空间,导致迭代器失效。
  • 解决:若扩容,扩容后对迭代器更新,指向新空间的相对位置。

1.2. 情况2:删除导致迭代器失效

  • 原因:erase() 删除pos位置元素后,pos变成野指针,导致迭代器失效。
  • 解决:使用erase() 的返回迭代器对pos重新赋值,指向删除元素之后位置的迭代器。

1.3. 情况3:尾删导致迭代器失效

  • 原因:erase() 删除pos位置元素后,pos位置之后的元素会往前移动,但如果pos指向最后一个元素,删除后pos迭代器会失效。
  • 解决:if语句判断pos迭代器是否等于超过末尾迭代器end,若不等于时,允许访问pos迭代器。

2. STL怎么做内存管理

  • STL采用两级配置器,当分配的空间大小超过128B时,使用第一级配置器,直接使用malloc()、free()和realloc()等C函数进行内存空间的分配、释放和重新分配;当分配的空间大小小于128B时,为了减少申请小内存造成的内存碎片问题,使用第二级配置器(次级配置器),采用了内存池技术,通过空闲链表管理内存。
  • 第二级配置器具体操作:每次配置一大块内存,并维护16个空闲链表,对应管理大小为8~128B内存块。分配空间时,首先根据所需空间大小调整为8B的倍数,找到对应空闲链表,从链表中取出第一个可用的区块,如果没有可用区块,则调用refill()重新填充空间,新空间取自内存池。释放空间时, 由配置器回收到相应大小的空闲链表中。
  • 内存池技术优劣势:避免外部碎片,不需要频繁从用户态切换到内核态,性能高效。但是,仍然会造成内存浪费,如申请6B内存就必须分配8B,有2B的内部碎片。

3. 如何解决哈希冲突?

  • 哈希表,通过直接计算key的哈希值来访问元素。
  • 哈希表长度使用质数(只能被1和自身整除),可以降低发生冲突的概率,使哈希后的数据更加均匀;但如果使用合数,可能会导致很多数据集中分布到一个点上,造成冲突
  • 解决
    • 开放地址法:寻找其他位置来存放。包括线性探测法、平方探测法、再哈希法。
    • 链表法:直接添加到计算位置的链表中。

4. vector手动释放内存问题

  • 场景:vector包含大量数据时,如vector分配了10000个数据大小的内存,然后使用erase()删除9999个数据,留下一个有效数据,但内存占用仍为10000个数据大小,所有内存空间要等vector析构时才被系统回收,因此有必要主动释放vector内存。
  • 解决:使用 vector< int >(vec).swap(vec) 释放vec中多余空间。也可以,使用vector< int >().swap(vec) 释放整个vecter空间。
  • 采用swap释放内存原理:vector< int >()使用默认构造函数创建临时vector对象;再使用swap() 将临时对象与vec对象交换;最后临时对象被析构,从而释放其占用的内存。

5. 对象池思想

  • 对于需要频繁创建和销毁对象的场景。
  • 对象池思想:首先从对象池中寻找可用的对象并把它激活,若没有就创建对象来使用;当一个对象不使用时,不把它销毁,而是将它设置为不激活状态并放入对象池中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于YOLOv5的人脸目标检测

本文是在之前的基于yolov5的人脸关键点检测项目上扩展来的。因为人脸目标检测的效果将直接影响到人脸关键点检测的效果&#xff0c;因此本文主要讲解利用yolov5训练人脸目标检测(关键点检测可以看我人脸关键点检测文章) 基于yolov5的人脸关键点检测&#xff1a;人脸关键点检测…

ROS学习笔记(18):建图与定位(2)

0.前言 上文提到现在的我们已经进入到了SLAM领域的学习&#xff0c;会涉及到大量专业知识&#xff0c;作为一个自学的大三&#xff08;好吧也快大四了&#xff09;萌新并不能保证每次文章的专业性和准确性&#xff0c;所以&#xff0c;本人推荐大家能自己去查阅一些相关书籍和…

TOB传输、承载网拓扑图

1、用户面&#xff1a;GNODEB>UPE>SPE>NPE>UPF>CMNET网 2、控制面&#xff1a;GNODEB>UPE>SPE>NPE>IP承载网>核心网

充分利用智慧校园人事系统,提升党政职务管理

智慧校园人事系统中的党政职务管理功能&#xff0c;是专为高校及教育机构设计的&#xff0c;旨在高效、精确地处理与党政职务相关的各类事务&#xff0c;包括职务任命、任期管理、职责分配、考核评估等&#xff0c;以信息化手段促进党务及行政工作的透明化、规范化。 该模块首先…

redis主从复制哨兵模式集群管理

主从复制&#xff1a; 主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份&#xff0c;以及对于读操作的负载均衡和简单的故障恢复。缺陷&#xff1a;故障恢复无法自动化&#xff1b;写操作无法负载均衡&…

像学Excel 一样学 Pandas系列-创建数据分析维度

嗨&#xff0c;小伙伴们。又到喜闻乐见的Python 数据分析王牌库 Pandas 的学习时间。按照数据分析处理过程&#xff0c;这次轮到了新增维度的部分了。 老样子&#xff0c;我们先来回忆一下&#xff0c;一个完整数据分析的过程&#xff0c;包含哪些部分内容。 其中&#xff0c…

好久不见!写了一个自动截图神器~【附源码】

文章目录 前言新增功能介绍截图功能快捷键设置 程序设计和使用介绍操作菜单栏选择点击坐标点选择图片选择截图区域快捷键设置 表格循环次数状态栏 使用案例源代码 前言 好久没更新文章了。上一次更新是在4月16日差不多&#xff0c;也只是写了一个错误集&#xff0c;没什么太多…

【Python机器学习】模型评估与改进——在模型选择中使用评估指标

我们通常希望&#xff0c;在使用GridSearchCV或cross_val_score进行模型选择时能够使用AUC等指标。scikit-learn提供了一种非常简单的实现方法&#xff0c;那就是scoring参数&#xff0c;它可以同时用于GridSearchCV和cross_val_score。你只需要提供一个字符串&#xff0c;用于…

基于Vue的MOBA类游戏攻略分享平台

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java技术、SpringBoot框架、B/S模式、Vue.js 工具&#xff1a;MyEclipse、MySQL 系统展示 首页 用…

大模型技术在辅助学习中的应用

大模型技术在辅助学习中的应用场景非常广泛&#xff0c;以下是一些典型示例。大模型技术在辅助学习中具有广阔的应用前景&#xff0c;可以为学生提供更加个性化、智能化和高效的学习体验。随着大模型技术的不断发展&#xff0c;我们可以期待在未来看到更多创新应用。北京木奇移…

免费最好用的证件照制作软件,一键换底+老照片修复+图片动漫化,吊打付费!

这款软件真的是阿星用过的&#xff0c;最好用的证件照制作软件&#xff0c;没有之一&#xff01; 我是阿星&#xff0c;今天要给大家安利一款超实用的证件照工具&#xff0c;一键换底&#xff0c;自动排版&#xff0c;免费无广告&#xff0c;让你在家就能轻松搞定证件照&#…

强化学习的数学原理:最优贝尔曼公式

大纲 贝尔曼最优公式是贝尔曼公式的一个特殊情况&#xff0c;但其也非常重要。 本节课很重要的两个概念和一个工具&#xff1a; 工具不用多说&#xff0c;就是贝尔曼最优公式&#xff0c;概念则是 optimal state value&#xff08;最优状态价值&#xff09; 和 optimal polic…

Django开发实战(1)- 认识django

1.django 使用MTV模式&#xff0c;其实与MVC本质一样&#xff1a; model&#xff1a;业务对象和关系映射&#xff08;ORM&#xff09; template&#xff1a;客户端页面展示 view&#xff1a;业务逻辑&#xff0c;根据需求调用 2.开发相关 √ python √ html&…

鸿蒙数据防泄漏(DLP)【Data Loss Prevention Kit开发指导】

Data Loss Prevention Kit开发指导 DLP是系统提供的系统级的数据防泄漏解决方案&#xff0c;提供一种称为DLP的文件格式。后缀格式为“原始文件名&#xff08;包含原始文件后缀&#xff09;.dlp”&#xff0c;例如: “test.docx.dlp”&#xff0c;文件由授权凭证和原始文件密文…

8款你不一定知道的良心软件!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/我们使用一些流行的软件的时候&#xff0c;往往会忽略一些功能非常强大的软件&#xff0c;因为这些软件的众 多&#xff0c;都因为看不见而丢失&a…

【ACM出版-EI稳检索】第三届金融创新、金融科技与信息技术国际学术会议(FFIT 2024,7月26-28)

第三届金融创新、科技与信息技术国际学术会议&#xff08;FFIT 2024&#xff09;将于2024年07月26-28日于重庆举行。 FFIT2024 将围绕“金融创新”、"金融科技”与“信息技术”等相关最新研究领域&#xff0c;为来自国内外高等院校、科学研究所、企事业单位的专家、教授、…

Vue3Echarts写关于温湿度统计的好看折线图

在项目统计界面&#xff0c;我们离不开对Echarts的使用&#xff0c;接下来是我在做项目过程中做的一个关于温湿度统计的好看折线图&#xff0c;统计的是温度蓝色和湿度绿色&#xff0c;它们还会有告警和断电&#xff0c;分别用橘黄色和红色区分&#xff0c;以下是示例&#xff…

CesiumJS【Basic】- #056 绘制纹理填充多边形(Entity方式)-使用shader

文章目录 绘制纹理填充多边形(Entity方式)-使用shader1 目标2 代码2.1 main.ts绘制纹理填充多边形(Entity方式)-使用shader 1 目标 使用Entity方式绘制绘制纹理填充多边形 - 使用shader 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium…

Linux系统中交叉编译opencv库

目标&#xff1a;将opencv进行交叉编译&#xff0c;使其能在rk3326板子上运行使用。 环境&#xff1a; ubuntu&#xff1a;18.04 opencv:4.5.4 opencv源码从挂网下载&#xff1a;opencv源码下载地址 交叉编译链&#xff1a;gcc-arm-10.3-linux-gun 一.环境准备 1.交叉编译链我…

【RT摩拳擦掌】如何构建RT AVB switchendpoint平台

【RT摩拳擦掌】如何构建RT AVB switch&endpoint平台 一&#xff0c;文档简介二&#xff0c;平台构建2.1 软硬件情况2.2 配置RT1170 AVB端点2.2.1 1块MIMXRT1170开发板做talker配置2.2.2 2块MIMXRT1170开发板做listener配置 2.3 AVB Switch 配置2.3.1 MOTU AVB Switch2.3.2 …