[C++面试] 标准容器面试点
一、入门
1、vector和list的区别
[C++面试] vector 面试点总结
vector 是动态数组,它将元素存储在连续的内存空间中。支持随机访问,即可以通过下标快速访问任意位置的元素,时间复杂度为 O(1),准确点是均摊O(1)。但在中间或开头插入、删除元素效率较低,因为需要移动后续元素,时间复杂度为 O(n)。
vector:需要频繁随机访问或尾部操作(如数据缓存、动态数组)
list 是双向链表,元素在内存中不连续存储。不支持随机访问,访问元素需要从头或尾开始遍历,时间复杂度为 O(n)。但在任意位置插入、删除元素效率较高,时间复杂度为 O(1)。
list需要频繁在任意位置插入/删除(如LRU链表、需要稳定迭代器的场景)
2、set和map的主要用途是什么?
set关联容器,用于存储唯一的元素,并且会对元素进行自动排序(默认按升序)。主要用于需要快速查找元素是否存在的场景,插入、删除和查找操作的时间复杂度均为 O(logn)。map关联容器,它存储的是键-值对,键是唯一的,并且会根据键进行排序。主要用于需要根据键快速查找对应值的场景,插入、删除和查找操作的时间复杂度同样为 O(logn)。
3、map和set的底层实现是什么?为什么?
- 底层实现:红黑树(自平衡二叉搜索树)。
- 原因:红黑树保证插入、删除、查找的时间复杂度为O(log n),且自动维护元素有序性。
如果问你红黑树的细节,你直接回答不了解。如果坚持让你回答,那就是在劝退你,也别浪费时间了
二、进阶
1、deque相对于vector和list有什么优势,适用于什么场景?
[C++面试] 关于deque-CSDN博客
deque是双端队列,结合了vector和list的部分优点。它支持随机访问,虽然效率略低于vector,但也能在O(1) 时间内访问元素。同时,在两端插入和删除元素的效率较高,时间复杂度为 O(1),但中间插入仍需O(n)。- 中间插入效率:与
vector类似,都需要移动元素,但deque的块结构可能减少部分元素移动,实际性能需具体测试。 deque由多个固定大小的数组块(chunk)组成,通过中控器(指针数组)管理。
整体上,deque对于给定的索引,计算出所在的块和块内偏移量并访问元素的操作次数是固定的,不随元素数量的增加而增加,所以其随机访问的时间复杂度仍然是 O(1) ,不过因为多了定位块的操作,效率会略低于
vector。
- 当需要在容器两端频繁插入和删除元素,同时也需要随机访问元素时,
deque是一个不错的选择,例如实现队列或栈。
2、priority_queue的特点是什么,如何使用?
priority_queue 是优先队列,它是一种容器适配器,默认使用 vector 作为底层容器,并且使用大顶堆(最大元素位于堆顶)来实现。它的特点是可以在 \(O(log n)\) 的时间复杂度内插入元素和删除堆顶元素,并且可以在 \(O(1)\) 的时间复杂度内访问堆顶元素。
std::priority_queue<int> pq;pq.push(3);pq.push(1);pq.push(2);
3、 为什么priority_queue默认用vector而不是deque作为底层容器?
- 堆操作(如
push_heap、pop_heap)需要随机访问,vector的连续内存访问更高效。 deque的复杂内存布局可能导致堆操作性能下降。
4、forward_list和list相比,有什么优缺点,使用时需要注意什么?
- 优点:
forward_list是单向链表,只支持单向遍历,内存开销更小,插入和删除操作的效率也更高,因为只需要维护一个指针。每个节点只有后向指针 。 - 缺点:不支持反向遍历,访问元素只能从头开始依次向后遍历,并且没有
size()成员函数,获取元素数量需要手动遍历。 - 使用注意事项:由于
forward_list没有push_back()方法,只能使用push_front()插入元素。在插入和删除元素时,需要注意迭代器的有效性,因为操作可能会使迭代器失效。 - 场景:
forward_list:内存敏感场景(如嵌入式系统),且只需单向遍历(如哈希表冲突链表)。list:需要反向操作或双向迭代器(如某些中间节点删除需前驱指针)。
5、stack是容器吗?它的默认底层容器是什么?
stack是容器适配器,不是独立容器。(概念考察)- 默认底层容器是
deque(支持两端高效操作),也可用vector或list
三、高阶
1、如何为自定义类型选择容器?例如存储Student对象,需要按学号快速查找。
需求分析(开放题,仅供参考):
- 若需有序性且频繁查找:用
map<int, Student>(学号为键)。 - 若无需有序性但需更快查找:用
unordered_map(哈希表,O(1)查找)。 - 若需频繁插入/删除且有序性不重要:用
vector+排序(或维护有序插入)。
2、vector的迭代器失效场景有哪些?如何避免?
[C++面试] vector 面试点总结-CSDN博客
- 插入元素导致容量变化(内存重分配):所有迭代器失效。
- 删除元素:被删位置后的迭代器失效。
避免方法
- 预分配足够容量(
reserve)减少重分配。- 插入/删除后重新获取迭代器。
vector<bool>可能是个坑(见上述链接)
- 标准规定
vector<bool>使用位压缩存储,每个元素占1 bit,但行为类似引用而非普通bool。- 陷阱:不能直接取元素地址,且迭代器行为异常(如无法修改
*iter的值)
3、map::operator[]和map::insert的陷阱是什么?
3.1、operator[]:若键不存在,会插入一个默认值,可能导致意外内存增长。
map<string, int> scores = {{"Alice", 90}, {"Bob", 85}};
// 尝试读取不存在的键 "Charlie"
int charlie_score = scores["Charlie"]; // 插入 {"Charlie", 0}
用 find 替代 operator[] 进行安全查找:
auto it = scores.find("Charlie");
if (it != scores.end()) {int charlie_score = it->second;
} else {// 处理键不存在的情况
}
3.2、insert:若键已存在,不会覆盖原有值,而是保留原有值,并返回一个 pair<iterator, bool>,其中 bool 为 false。需用insert_or_assign(C++17)或先find再更新。
map<string, int> scores = {{"Alice", 90}, {"Bob", 85}};
// 尝试插入或更新 "Alice" 的分数
scores.insert({"Alice", 95}); // 插入失败,原有值 90 保留
// 输出结果
cout << "Alice's score: " << scores["Alice"] << endl; // 输出 90
方法1:insert_or_assign(C++17)
- 若键存在,更新值;若不存在,插入新键值对。
int main() {map<string, int> scores = {{"Alice", 90}, {"Bob", 85}};// 更新 "Alice" 的分数为 95scores.insert_or_assign("Alice", 95); // 更新成功scores.insert_or_assign("Charlie", 80); // 插入新键值对
}
方法2:先 find 再更新
auto it = scores.find("Alice");
if (it != scores.end()) {it->second = 95; // 直接修改迭代器指向的值
} else {scores.insert({"Alice", 95});
}
方法3:operator[] + 赋值
- 若确定键需要插入或更新,可直接用
operator[]:
scores["Alice"] = 95; // 无论 "Alice" 是否存在,值都会被设为 95
实际场景建议
只读访问:用
find替代operator[],避免意外插入。需要插入或更新:
C++17+:优先用
insert_or_assign。C++11:用
find检查是否存在,再决定插入或更新。明确需要覆盖:直接使用
operator[] = value。
4、如何高效合并两个有序vector?
- 方法1:先
insert后sort(时间复杂度高,O(n log n))。 - 方法2:使用
std::merge(时间复杂度O(n),需额外空间):
vector<int> merged;
merged.reserve(v1.size() + v2.size());
merge(v1.begin(), v1.end(), v2.begin(), v2.end(), back_inserter(merged));
总结:

相关文章:
[C++面试] 标准容器面试点
一、入门 1、vector和list的区别 [C面试] vector 面试点总结 vector 是动态数组,它将元素存储在连续的内存空间中。支持随机访问,即可以通过下标快速访问任意位置的元素,时间复杂度为 O(1),准确点是均摊O(1)。但在中间或开头插…...
单片机学完开发板,如何继续提升自己的技能?
很多人学完开发板后都会卡在一个尴尬的阶段:觉得自己会的东西不少,但又不知道下一步该干啥。会点C语言,能烧录程序,能点亮LED,玩转按键,搞定串口等等,能用开发板做点小玩意儿,但面对…...
luogu「EZEC-10」打分 --- Python3 解法
题目链接: 「EZEC-10」打分 import sysdef max_score(n, m, scores):scores.remove(min(scores)) # 最小值的选取,不影响中间部分的处理scores.sort()max_ scores[-1]sum_ sum(scores[:-1]) # 中间部分len_ len(scores)needed (len_ - 1) * max_ …...
MySQL事务介绍
一、一个典型的事务场景 步骤操作描述SQL 语句1开启事务,确保转账操作的原子性START TRANSACTION;2从用户 A 的账户中扣除 100 元UPDATE account SET balance balance - 100 WHERE user A;3向用户 B 的账户中添加 100 元UPDATE account SET balance balance 1…...
明基PD2700U显示器无法调节图像模式
现象:明基PD2700U显示器无法调节图像模式,如下图: 目前未找到根本原因,推测可能是下面的原因: 1、安装了远程桌面软件:向日葵、虚拟显示器 2、显卡插入了接口,但是没接显示器 解决办法…...
基于FPGA轨道交通6U机箱CPCI脉冲板板卡
板卡简介: 本板为脉冲板,脉冲板主要执行CPU下达的指令,通过实现各种控制算法来调节PWM,然后输出光纤PWM信号来驱动变频器功率模块以达到控制电机的目的。 性能规格: 电源:DC5V;15V FPGA&…...
SpringBoot-已添加并下载的依赖,reload和mvn clean 后还是提示找不到jar包问题
背景: 添加spring-jdbc依赖时,原来是指定版本的,担心版本冲突,就改成依赖托管,悲剧的是反复reload和mvn clean,import到类的该包一直标红,提示jar包找不到。。。 解决方案: Idea左上…...
如何通过 Airbyte 将数据摄取到 Elasticsearch
作者:来自 Elastic Andre Luiz Airbyte 是一个数据集成工具,可自动化并可扩展地将信息从各种来源传输到不同的目的地。它使你能够从 API、数据库和其他系统提取数据,并将其加载到 Elasticsearch 等平台,以实现高级搜索和高效分析。…...
配置 VSCode 的 C# 开发环境
1. 安装必要的依赖 1.1 VSCode 扩展 安装 C# 相关插件(如 C#、C# Extensions 等)。 1.2 .NET SDK 下载地址:.NET SDK 下载页面 1.3 安装检测 在命令行输入以下命令,如果正确返回了版本号,则表示 .NET SDK 安装成…...
如何用DeepSeek进行项目管理?AI重构项目全生命周期的实践指南
一、项目管理的核心工作范畴 现代项目管理包含六大核心模块,构成完整管理闭环: 1. 需求管理(20%工作量) 案例:某电商平台"双11"大促项目需整合23个部门的142项需求 关键动作:需求收集→优先级…...
Git 回退操作详解:带示例的“小白”指南
前言 在日常开发中,我们难免会遇到: 改错代码:推送之前才发现某些行根本就不该动提交错误:commit 信息打错、提交到错误分支想回到之前版本:测试时发现之前版本是好的,需要回去查看 这就需要用到 Git 的…...
vue3 引入element-plus组件后,发现输入的时候没有提示,而且鼠标移到el-button显示unknown的简单解决方法
1、element-plus官方地址 一个 Vue 3 UI 框架 | Element Plus 2、安装 安装 | Element Plus 3、安装插件unplugin-vue-components、unplugin-auto-import并配制 快速开始 | Element Plus 4、输入关键词没有提示及ElButton:unknown的处理 1)装个扩展插件…...
如何让焦虑为城市供能 | 杂谈
凌晨两点,我盯着满桌冷掉的碳烤磷虾烩面——这顿价值500星币的宵夜。当冒充食客的就餐员像幽灵般消失后,躁动的神经末梢突然刺破迷雾:那些令人窒息的负能量,是否能在量子层面转化为清洁动能? 这个疯狂假设打开了四维能…...
【Linux】浅谈环境变量和进程地址空间
一、环境变量 基本概念 环境变量(Environment Variables)是操作系统提供的一种机制,用于存储和传递配置信息、系统参数、用户偏好设置等。 环境变量的作用 配置程序行为: 程序可以通过环境变量获取配置信息,例如日…...
如何使用 DeepEval 优化 Elasticsearch 中的 RAG 检索
作者:来自 Elastic Kritin Vongthongsri 学习如何使用 DeepEval 优化 RAG 流水线中的 Elasticsearch 检索器。 LLMs 容易产生幻觉、缺乏特定领域的专业知识,并受限于上下文窗口。检索增强生成(Retrieval-Augmented Generation - RAGÿ…...
行为模式---状态模式
概念 状态模式是一种行为模式,用于在内部状态改变的时候改变其行为。它的核心思想就是允许一个对象在其内部状态改变的时候改变它的行为。状态模式通过将对象的状态封装成独立的类,并将其行为委托给当前的状态对象,从而使得对象行为随着状态…...
嵌入式裸机设计--MCU常用裸机架构有哪些?
为什么是裸机设计 792125321入群学习更高效! 在MCU(微控制器单元)裸机开发中,我们常见的架构设计主要围绕如何高效管理资源和任务调度。认识这些开发方式,对我们开发一个小型项目来说及有好处! 下面介绍…...
【LInux进程六】命令行参数和环境变量
【LInux进程六】命令行参数和环境变量 1.main函数的两个参数2.利用main函数实现一个简单的计算器3.环境变量之一:PATH4.修改PATH5.在命令行解释器bash中查看所有环境变量6.用自己写的程序查看环境变量7.main函数的第三个参数8.本地的环境变量和环境变量9.环境变量具…...
深度解析前端面试八股文:核心知识点与高效应对策略
深度解析前端面试八股文:核心知识点与高效应对策略 1. 引言 前端面试是每位开发者迈向职业进阶的重要环节,涉及 HTML、CSS、JavaScript、性能优化、浏览器原理、网络、安全、框架(Vue/React) 等核心知识点。本文不仅会覆盖 前端…...
激光slam学习笔记10---ubuntu2004部署运行fastlivo2踩坑记录
背景:mars实验室又发福利啦!跑跑效果,验了那句,mars出品,必属精品!本人pc环境ubuntu20.04,基本流程按照readme走就行,sophus和vikit安装有些注意地方。本文做了一些部署踩坑记录&…...
织梦DedeCMS优化文章模版里的“顶一下”与“踩一下”样式
测试的版本5.7.1UTF-8 一、插入<head>Js代码 将下面代码插入到文章模版里的<head>标签里 <script language"javascript" type"text/javascript" src"{dede:global.cfg_cmsurl/}/include/dedeajax2.js"></script> <…...
IDEA+Docker插件一键部署SpringBoot项目到远程服务器
文章目录 1. 服务端1.1 安装Docker1.2 Docker放开远程连接1.3 重启Docker1.4 开放端口1.4.1 云端1.4.2 服务器内部防火墙指令 2.IntelliJ IDEA2.1 安装IDEA2.2 安装Docker插件2.3 SSH Configurations2.4 Docker选择对应的SSH2.5 Dockerfile2.5.1 Dockerfile2.5.2 Dockerfile Ed…...
【SoC基础】单片机之RCC模块
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...
机器学习之梯度消失和梯度爆炸
文章目录 梯度消失1. 原理2. 影响3. 易出现情况4. 解决方法5. 编程实战案例 梯度爆炸1. 原理2. 影响3. 易出现情况4. 解决方法5. 编程实战案例 常用权重初始化方法及其影响1. 随机初始化2. Xavier初始化(Glorot初始化)3. Kaiming初始化(He初始…...
C++基础 [五] - String的模拟实现
目录 前言 string类的模拟实现 成员函数的实现 构造函数 拷贝构造函数 赋值运算符重载 析构函数 元素访问的实现 operator[ ] Iterator - 迭代器 容量大小的实现 size capacity reserve 编辑resize 内容修改的实现 push_back append operator(char ch) …...
LLVM学习-- 构建和安装
一 LLVM版本 二 适用预构建的二进制文件安装LLVM 三 适用包管理器安装LLVM 四 从源码构建用于Linux的LLVM 五 从源码构建用于Windows和Visual Studio的LLVM 六 从源码构建用于MacOS 和XCode的LLVM 1.1 LLVM项目从10年前第一次发布到版本3.4,其SVN存储库包含了超过20…...
python中使用单例模式在整个程序中只创建一个数据库连接,节省资源
示例代码: from loguru import logger from pymongo import MongoClient from pymongo.errors import ConnectionFailurefrom llm_engineering.settings import settingsclass MongoDatabaseConnector:_instance: MongoClient | None Nonedef __new__(cls, *args,…...
AIAgent有哪些不错的开源平台
AIAgent领域有许多优秀的开源平台和框架,以下是一些值得推荐的开源平台: AutoGPT AutoGPT 是一个基于 OpenAI 的 GPT-4 和 GPT-3.5 大型语言模型的开源框架,能够根据用户给定的目标自动生成所需提示,并利用多种工具 API 执行多步骤…...
Python刷题:流程控制(上)
今天刷的是PythonTip的Python 入门挑战中的题,整体难度不高,适合小白练手以及巩固知识点。下面会进行详细讲解。 每日一句 每一个拼命努力的人,都像是独自穿越黑暗森林的行者, 没有并肩的身影,唯有孤独如影随形&…...
vulhub/Billu_b0x靶机----练习攻略
1.Billu_b0x靶场下载链接: https://download.vulnhub.com/billu/Billu_b0x.zip 2.下载后,解压出ova文件,直接拖至VMware中,重命名和选择存储位置,点击导入,报错点击重试即可。修改网卡为NAT模式。 打开靶…...
