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.mzph.cn/pingmian/38360.shtml

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

相关文章

基于SSM的校园闲置物品交易平台

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SSM的校园闲置物品交易平台,java项目…

Advanced RAG 09:『提示词压缩』技术综述

编者按&#xff1a; 如何最大限度地发挥 LLMs 的强大能力&#xff0c;同时还能控制其推理成本&#xff1f;这是当前业界研究的一个热点课题。 针对这一问题&#xff0c;本期精心选取了一篇关于"提示词压缩"(Prompt Compression)技术的综述文章。正如作者所说&#xf…

Zookeeper 四、Zookeeper应用场景

Zookeeper是一个典型的发布/订阅模式的分布式数据管理与协调框架&#xff0c;我们可以使用它来进行分布式数据的发布与订阅。另一方面&#xff0c;通过对Zookeeper中丰富的数据节点类型进行交叉使用&#xff0c;配合Watcher事件通知机制&#xff0c;可以非常方便地构建一系列分…

八爪鱼现金流-032,给用户发邮件提示功能

每个月的 5 号、15 号、25 号的 17:30 工资日&#xff0c;给用户发送邮件&#xff0c;提示记账月报。 您也来记账一笔吧。 然后首页能看到趋势图。 八爪鱼现金流 八爪鱼

【Apache Doris】周FAQ集锦:第 9 期

【Apache Doris】周FAQ集锦&#xff1a;第 9 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

3072. 将元素分配到两个数组中 II Hard

给你一个下标从 1 开始、长度为 n 的整数数组 nums 。 现定义函数 greaterCount &#xff0c;使得 greaterCount(arr, val) 返回数组 arr 中 严格大于 val 的元素数量。 你需要使用 n 次操作&#xff0c;将 nums 的所有元素分配到两个数组 arr1 和 arr2 中。在第一次操作中&a…

LeetCode 算法:二叉树的右视图 c++

原题链接&#x1f517;&#xff1a;二叉树的右视图 难度&#xff1a;中等⭐️⭐️ 题目 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4…

算力时代,算能(SOPHGO)的算力芯片/智算板卡/服务器选型

数字经济时代&#xff0c;算力成为支撑经济社会发展新的关键生产力&#xff0c;全球主要经济体都在加快推进算力战略布局。随着大模型持续选代&#xff0c;模型能力不断增强&#xff0c;带来算力需求持续增长。算力对数字经济和GDP的提高有显著的带动作用&#xff0c;根据IDC、…

【面试系列】Elasticsearch 高频面试题

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

java基础知识点全集

JAVA的所有知识点 一、基础的数组、数据类型、输入输出二、类与对象1. 三大特征&#xff08;1&#xff09; 封装&#xff08;2&#xff09;继承&#xff08;3&#xff09;多态 2. 类的实例化&#xff08;1&#xff09; 类通过NEW来创建&#xff08;2&#xff09; 类的继承&…

ARP认识与学习

第1步&#xff1a; 进入root模式&#xff0c;使用iwonfig或者ifconfig &#xff0c;查看目前的网段&#xff1b; iwconfig ifconfig第2步&#xff1a; 扫描网段的其他连接设备&#xff0c;根据实际的网段填写 nmap 192.168.3.0-255第3步&#xff1a; 1表示帮助转发数据&#…

AH1117-3.3芯片使用记录

今天在新做好的电路板上测试电源时发现一个问题&#xff0c;那就是散热端不能接地&#xff0c;接地了就好像短路一样&#xff0c;芯片会热的厉害&#xff0c;当我把该引脚与地的所有连接都切断后&#xff0c;短路现象消失&#xff0c;特此记录一下&#xff0c;防止自己下次再犯…

本地Navicat/客户端连接阿里云RDSMySQL时遇到过的问题及解决

1.之前开发的RDS MySQL版本和本地MySQL版本最好接近&#xff0c;比如8.0.28和8.0.20好像都是可以兼容的&#xff0c;他们里面都有那个utf8的字符编码&#xff0c;但是后面我选的RDS MySQL版本有点新&#xff0c;是8.0.30甚至更新的版本&#xff0c;之前用C#语言写的连接MySQL以…

二叉搜索树(Binary Search Tree)

二叉搜索树&#xff08;Binary Search Tree&#xff09;是一种树形数据结构&#xff0c;它具有以下特点&#xff1a; 若任意节点的左子树不为空&#xff0c;则左子树上所有节点的值均小于它的根节点的值。若任意节点的右子树不为空&#xff0c;则右子树上所有节点的值均大于它…

[游戏开发][UE5]引擎学习记录

C Log和蓝图Log C Log 方法 UE_Log(参数1&#xff0c;参数2&#xff0c;参数3) //举例: UE_LOG(LogTemp, Error, TEXT("Log Info: %s"),"Test Log"); 三个参数的作用 参数1&#xff1a;输出窗口归类使用&#xff0c;你写什么它就显示什么 参数2&#x…

数据稀疏如何学好embedding?

在推荐系统中&#xff0c;冷启动或长尾是一个常见的问题&#xff0c;模型在数据量较少的user或item上的预测效果很差。造成冷启动样本预测效果不好的重要原因之一是&#xff0c;冷启动样本积累的数据比较少&#xff0c;不足以通过训练得到一个好的embedding&#xff08;通过use…

仓库管理系统13--物资设置

1、添加窗体 2、设计UI界面 注意这个下拉框的绑定&#xff0c;你看到的选项是由displaymember决定&#xff0c;当你选择了哪个选项时&#xff0c;后台绑定这个选项的ID <UserControl x:Class"West.StoreMgr.View.GoodsView"xmlns"http://schemas.microsoft…

基于Python爬虫的论文文献检索系统

基于Python爬虫的论文文献检索系统 一、项目背景二、程序设计思路三、完整代码一、项目背景 文献检索是论文写作中一个重要环节,是写好论文的必要手段。论文写作的前提是必须掌握尽可能多的文献信息资料,借鉴前人的优秀成果,才能写出好的文章。因此,在写作论文时,如何学会…

React 打包时如何关闭源代码混淆

React 开发中&#xff0c;使用 npm build 命令进行生产代码打包&#xff0c;为了压缩代码并尽量保证代码的安全性&#xff0c;React 打包时会代码进行压缩和混淆&#xff0c;但是有时我们需要 debug 生产环境的源代码&#xff0c;例如当我们调试 SSR 的项目时&#xff0c;需要禁…

成为画图大师,用图表讲故事

这些问题你是否遇到过: 项目总结会上&#xff0c;如果用数据呈现你做的价值&#xff1f; 完善详尽的数据分析得出了让人信服的结论&#xff0c;如何呈现在BOSS面前? 我们要的不是数据&#xff0c;而是数据告诉我们的事实 数据很重要&#xff0c;但只是原料&#xff0c;所以…