当前位置: 首页 > java >正文

MyTinySTL

MyTinySTL

  • 为什么选择实现一个简化版STL?
  • 细说你对STL 的深入理解
      • 如何实现vector的动态扩容?
      • 红黑树在map中的应用及优势?
      • 如何处理迭代器失效问题?
      • 如何测试容器性能?
      • 如何优化哈希表(unordered_map)的性能?
      • 如果被问到未实现的细节(如deque的迭代器设计)?
      • 从项目中学到的最重要的技术点?
  • MyTinySTL与标准STL的主要区别是什么?
  • 细说你针对哪些特殊场景做出了改变,对效率提高了多少
      • 内存分配策略:
      • stack 容器
      • 对于数据排序算法
      • 内存泄漏检测

为什么选择实现一个简化版STL?

STL是C++标准库的核心,但底层实现复杂且抽象。通过实现MyTinySTL,可以深入理解容器迭代器内存分配器等核心组件的设计原理,也能让我更好地理解C++ 项目

细说你对STL 的深入理解

如何实现vector的动态扩容?

回答:vector底层是动态数组,当size超过capacity时会触发扩容。MyTinySTL采用2倍扩容策略(标准库可能为1.5倍),通过new申请新内存拷贝原有数据释放旧内存扩容时迭代器会失效,因为元素地址发生变化

红黑树在map中的应用及优势?

回答:红黑树是自平衡二叉搜索树,保证插入删除查找时间复杂度为O(log n)。在map中还需要对键进行排序,键值对按红黑树规则排序,支持有序遍历。相比哈希表(unordered_map),红黑树在频繁插入删除时更稳定,无需处理哈希冲突

如何处理迭代器失效问题?

回答:以vector为例,插入或删除元素可能导致迭代器失效。例如,push_back触发扩容时,所有迭代器、指针、引用失效;erase删除元素后,被删除位置之后的迭代器失效解决方案是使用erase返回的合法迭代器继续操作

如何测试容器性能?

回答:通过单元测试框架(如TestCase和UnitTest类)验证功能正确性;性能测试可通过插入大量数据(如1000万元素)对比标准库耗时。例如,vector插入耗时129ms(标准库210ms),体现了内存预分配和减少系统调用的优化

如何优化哈希表(unordered_map)的性能?

回答:采用链地址法解决哈希冲突,结合负载因子(如0.75)触发扩容。优化点包括:
使用质数作为桶数量减少哈希聚集
局部缓存哈希值避免重复计算

如果被问到未实现的细节(如deque的迭代器设计)?

回答:这个部分我不太了解,但基于STL原理,deque采用分段连续空间多个缓冲区+中控数组),迭代器需记录当前段位置边界。可引用《STL源码剖析》中的设计思路

从项目中学到的最重要的技术点?

回答:

  • 模板元编程:通过type_traits实现类型萃取,优化算法对不同数据类型的适配。
  • 内存管理:理解内存池自由链表如何减少碎片提升小对象分配效率
  • 迭代器设计:将容器与算法解耦,通过迭代器泛化访问逻辑

MyTinySTL与标准STL的主要区别是什么?

回答:它其实是标准库的简化版,然后因为我不用考虑兼容性,比如说操作系统的和编译器的兼容性,就避免了一些不必要的代码

然后我能够针对特定场景选择合适的策略,因此这个简化版的效率在部分场景会略高于标准库

细说你针对哪些特殊场景做出了改变,对效率提高了多少

内存分配策略:

两级分配器一级直接调用malloc处理大块内存,二级采用内存池管理小块内存(16个自由链表,管理8-128字节),减少内存碎片系统调用次数
标准库的 new/delete 会产生内存碎片并增加系统调用开销。

stack 容器

  • 我定义了两个参数,分别是指定初始大小和初始值
  • 在初始化stack时可传入
  • 标准STL呢,它需要先构造临时容器【通过deque】,再移动构造
std::deque<int> temp(100, 42); // 显式构造临时容器
std::stack<int> s(std::move(temp)); // 移动构造

对于数据排序算法

小规模数据用快速排序【例如size小于10000】
大规模数据使用归并排序减少内存访问

标准 STL 对比:
sort(通常是内省排序)在处理大数据时可能有较多随机内存访问

内存泄漏检测

特殊场景:检测内存泄漏和重复释放问题。
标准 STL 对比:
标准库未提供内置内存泄漏检测。【可以用智能指针避免泄漏】

MyTinySTL 的跟踪所有内存分配【比如说通过这个计数法,构造的时候加1,析构的时候减1】,程序结束时可报告未释放的内存块。

http://www.xdnf.cn/news/5683.html

相关文章:

  • 【idea】快捷键ctrl+shift+F(Find in files)不起作用
  • C++.Windows图形
  • 养生:开启健康生活的全新篇章
  • C++类和对象--中阶
  • js 画立方体软件开发日记2
  • QuickList
  • Docker编排工具详解:Docker Compose与Docker Swarm
  • 08.webgl_buffergeometry_attributes_none ,three官方示例+编辑器+AI快速学习
  • 电子工程领域常见的缩略语及其对应的中文和英文释义
  • Python-Flask-Dive
  • 【Java学习笔记】多态参数
  • 深度强化学习有什么学习建议吗?
  • VC++快捷使用安装libcurl
  • NY135NY141美光固态闪存NY162NY163
  • 歌曲《忘尘谷》基于C语言的歌曲调性检测技术解析
  • 深度学习---常用优化器
  • Nexus 私有仓库 + Nginx 反向代理部署文档
  • 数据结构(五)——串、数组、广义表
  • Ubuntu 安装 Docker(镜像加速)完整教程
  • java问题总结
  • Java笔记4
  • Windows重置网络,刷新缓存
  • 实训九 软件包管理
  • Python笔记:windows下永久配置pip镜像源
  • QT5.14安装以及新建基础项目
  • XOCIETY 携手 adidas 推出限量版 NFT 皮肤系列
  • 网络基础1(应用层、传输层)
  • Android CountDownTimer重写
  • RDMA核心组件 的总结表格
  • RSA算法详解一:初识RSA