C++ STL 面试高频题及详细答案(实战版)_第1页
C++ STL 面试高频题及详细答案(实战版)_第2页
C++ STL 面试高频题及详细答案(实战版)_第3页
C++ STL 面试高频题及详细答案(实战版)_第4页
C++ STL 面试高频题及详细答案(实战版)_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C++STL面试高频题及详细答案(实战版)说明:本套题目为后端、客户端、嵌入式C++面试高频原题,内容贴合工程实战,答案简洁精准、适配面试口述,无冗余理论套话。一、基础概念类1.简述什么是STL?STL由哪几部分组成?答案:STL是C++标准模板库,是一套封装好的通用数据结构和算法模板,不需要开发者重复造轮子,大幅提升开发效率,代码复用性和稳定性很高。STL主要分为四大核心部分:1.容器:存放数据的数据结构,比如vector、list、map、unordered_map等;2.算法:通用操作函数,排序、查找、遍历、去重等,比如sort、find、unique;3.迭代器:容器和算法的桥梁,统一遍历容器的接口;4.仿函数/适配器:用于配合算法、容器做自定义规则,比如greater、less。2.迭代器的作用是什么?迭代器和指针的区别?答案:迭代器是STL统一的遍历工具,用来访问容器中的元素,不需要关心容器底层结构,适配所有STL容器。和指针区别:1.指针是内存地址,迭代器是封装后的通用迭代类型;2.指针可以随意加减偏移,list迭代器不支持随机访问,只能自增自减;3.迭代器有层级分类,比如随机迭代器、双向迭代器,指针没有区分;4.部分容器迭代器失效机制和指针野指针逻辑不同。3.什么是迭代器失效?常见场景有哪些?怎么解决?答案:迭代器失效本质是容器底层内存结构发生变化,导致原有迭代器指向的内存失效,继续使用会出现崩溃、乱码、遍历异常。常见失效场景:1.vector:扩容、尾部插入大量元素、中间删除元素,都会导致迭代器失效;2.list:只有被删除节点的迭代器失效,其他迭代器不受影响;3.map/unordered_map:插入一般不失效,删除仅当前迭代器失效。解决方式:1.每次增删元素后,重新获取迭代器;2.删除元素时,接收erase返回的新迭代器;3.遍历删除尽量使用后置迭代器更新方式。二、序列容器高频题1.vector和list的区别?项目中如何选型?答案:vector底层:动态数组,连续内存,支持随机访问,访问速度快。优点:下标访问高效、缓存命中率高、遍历快;缺点:中间插入、删除效率低,扩容会拷贝数据、产生内存碎片。list底层:双向链表,非连续内存,不支持随机访问。优点:任意位置插入删除效率极高,不会扩容、不失效其他迭代器;缺点:只能逐个遍历,访问慢,内存占用更高。选型原则:1.频繁查询、遍历、随机访问,增删少→用vector;2.频繁中间插入、删除,查询少→用list。2.vector扩容机制详细说一下?扩容为什么是1.5倍或2倍?答案:vector初始有默认容量,当元素个数超过容量时触发扩容:1.开辟一块更大的新内存空间;2.将旧内存所有元素拷贝到新空间;3.释放旧内存;4.更新底层指针、容量、大小。扩容倍数:Linux/GCC默认2倍,Windows/VS默认1.5倍。原因:1.2倍扩容:扩容次数少,适合数据量大的场景;2.1.5倍扩容:扩容后剩余内存更小,内存利用率更高,更不容易出现内存浪费。所有扩容都会导致原有迭代器全部失效。3.vectorreserve和resize的区别?答案:1.reserve:只修改容量capacity,不修改元素个数size,只预分配内存,不初始化元素,不会改变已有数据,目的是提前扩容,避免多次扩容开销。2.resize:既修改size也可能触发容量变化,会初始化新元素,截断多余元素,会真正改变容器内有效元素数量。面试口诀:reserve只管容量不添数,resize既改大小又改数。4.deque底层原理?为什么适合做队列底层?答案:deque是双端队列,底层是分段连续内存,由多个小数组+中控索引数组组成,整体不连续,分段连续。特点:头尾增删效率极高,不需要拷贝搬迁数据,支持随机访问(效率低于vector)。queue、stack默认适配deque作为底层容器,原因:1.头尾插入删除O(1)效率;2.中间不常用,规避其随机访问弱的缺点;3.内存利用率比vector更高,无大规模扩容拷贝。三、关联容器高频题1.map和unordered_map的区别?工程如何选型?答案:map底层:红黑树,有序、平衡二叉搜索树。优点:key自动排序、遍历有序、稳定性强;缺点:增删查时间复杂度O(logn),速度较慢。unordered_map底层:哈希表,无序结构。优点:增删查平均O(1),查询速度极快;缺点:key无序,存在哈希冲突、极端情况复杂度退化,内存占用更大。选型:1.要求key有序、需要遍历排序结果、数据量不大→map;2.只需要快速查找、不关心顺序、数据量大→unordered_map。2.哈希冲突怎么解决?unordered_map用的哪种方式?答案:常见哈希冲突解决方式:开放定址法、链地址法、再哈希法。C++的unordered_map默认采用链地址法(拉链法)。原理:哈希表每个桶位挂一个链表,哈希值相同的key挂在同一个链表下,遍历链表比对key,解决冲突。当链表过长会转化为红黑树,提升查询效率,避免链表退化。3.set和unordered_set区别?底层原理?答案:set底层红黑树,元素自动去重、有序,查询O(logn);unordered_set底层哈希表,元素去重、无序,平均查询O(1)。两者都不允许重复元素,核心差异和map、unordered_map完全一致,只是没有value,只存key。4.红黑树的特性?为什么map要用红黑树不用普通二叉树?答案:红黑树五大核心特性(面试背核心四点即可):1.节点非黑即红;2.根节点为黑色;3.所有叶子节点为黑色;4.红色节点的子节点一定是黑色;5.任意节点到其叶子的所有路径,黑色节点数量相同。核心作用:限制最长路径不超过最短路径的2倍,保证树的平衡,避免二叉搜索树退化成链表,保证查询、插入、删除稳定O(logn)时间复杂度。四、容器适配器与算法1.stack、queue是容器吗?底层是什么?答案:stack和queue不属于独立容器,是容器适配器,基于已有容器封装实现。stack默认底层容器:deque;queue默认底层容器:deque;可以手动替换为vector、list等容器,只要满足对应接口规范即可。2.priority_queue优先级队列底层原理?大顶堆小顶堆怎么设置?答案:底层是堆结构(二叉堆),默认大顶堆,底层依赖vector存储数据。排序规则:1.默认less<T>,大顶堆,堆顶元素最大;2.传入greater<T>,小顶堆,堆顶元素最小。优先级队列不保证整体有序,只保证堆顶元素是极值,适合TOPK问题。3.sort排序原理?时间复杂度?是否稳定?答案:C++sort不是单一排序算法,是混合排序:1.数据量大:快速排序;2.数据量较小:插入排序;3.递归过深:堆排序。整体时间复杂度稳定O(nlogn),sort是不稳定排序。如果需要稳定排序,使用stable_sort。4.unique函数作用?为什么unique后要erase?答案:unique只能去除相邻重复元素,并不会真正删除容器元素,只是把重复元素后置,返回新的有效尾迭代器。所以必须搭配erase删除后置无效元素,才能完成真正去重。注意:使用unique前必须先sort,否则无法去除不相邻重复元素。五、工程实战高频压轴题1.说说vector、list、map、unordered_map增删查时间复杂度答案:1.vector:随机访问O(1),头尾插入删除O(1),中间增删O(n);2.list:任意位置增删O(1),查找访问O(n);3.map/set:增删查O(logn);4.unordered_map/unordered_set:平均O(1),最坏O(n)。2.遍历删除vector和map元素的正确写法?答案:核心原则:遍历删除必须接收erase返回值,避免迭代器失效。vector错误写法:直接it++删除,会导致迭代器失效崩溃;vector正确写法:it=vec.erase(it);map正确写法:it=map.erase(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论