跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

嵌入式 C/C++ 面试:STL 容器与算法详解

总结了嵌入式 Linux C++ 面试中常见的 STL 容器与算法知识点。涵盖 map 与 set 的红黑树实现区别、operator[] 的隐式插入风险、allocator 内存管理机制、vector 与 list 的性能差异、迭代器作用原理、epoll 事件驱动模型以及 resize 与 reserve 的区别。重点强调容器底层数据结构对性能的影响及正确删除元素的方法,为面试准备提供核心参考。

刀狂发布于 2026/3/29更新于 2026/9/864 浏览
嵌入式 C/C++ 面试:STL 容器与算法详解

在嵌入式 Linux / C++ 面试中,STL 容器几乎是必问内容。面试官不仅关心你'会不会用',更关心你是否理解:

  • 底层数据结构是什么?
  • 性能差异在哪里?
  • 什么时候该用 map,什么时候该用 unordered_map?

1. map 和 set 有什么区别?是如何实现的?

1.1 相同点

  • 都是 关联式容器
  • 底层实现:红黑树(RB-Tree)
  • 元素自动有序
  • 插入、删除、查找时间复杂度:O(logN)

1.2 不同点对比

对比项mapset
存储结构key-valuekey
是否允许修改value 可改不可改
迭代器非 constconst
是否支持下标支持不支持

1.3 为什么不能修改 key?

map/set 的有序性依赖 key:

  • 修改 key → 破坏红黑树结构
  • 需要删除 + 重新插入
  • 会导致迭代器失效

设计结论: STL 从接口层面直接禁止修改 key,保证容器稳定性。

2. map 的 operator[] 为什么要慎用?

map<int, int> m;
m[10]; // 若 key 不存在,会插入一个 value=0 的元素

注意点

  • 会 隐式插入元素
  • const map 不能使用
  • mapped_type 无默认构造函数时不可用
  • 仅用于 确认存在性 时不推荐

✅ 推荐做法:

auto it = m.find(10);
if (it != m.end()) {
    // 处理逻辑
}

3. STL allocator 的作用是什么?

3.1 new/delete 的问题

T* p = new T; // 分配内存 + 构造
delete p;     // 析构 + 释放内存

👉 内存管理与对象生命周期 耦合严重

3.2 allocator 的设计思想

STL allocator 将这两件事拆开:

操作函数
分配内存allocate
释放内存deallocate
构造对象construct
析构对象destroy

3.3 SGI STL 的两级分配器

  • >128B:一级配置器 → 直接 malloc / free
  • ≤128B:二级配置器 → 内存池 + 空闲链表

核心目的: 减少小块内存频繁申请造成的碎片问题。

4. STL 中如何正确删除元素?

4.1 vector / deque

it = v.erase(it); // erase 返回下一个有效迭代器
  • erase 后,后续元素 整体前移
  • 后面的迭代器全部失效

4.2 map / set

auto next = it;
++next;
m.erase(it);
it = next;
  • 红黑树结构
  • 只会使当前迭代器失效

4.3 list

  • 非连续内存
  • erase 返回下一个 iterator
  • 最安全

5. map 与 unordered_map 的区别?

对比mapunordered_map
底层结构红黑树哈希表
是否有序是否
查找效率O(logN)O(1) 平均
key 要求operator<hash + ==

结论: 不要求有序时,优先使用 unordered_map,性能更好。

6. vector 和 list 的区别?

特性vectorlist
底层数组双向链表
内存连续非连续
随机访问快不支持
插入删除慢快
扩容2 倍无

一句话总结: vector 适合查找,list 适合频繁插入删除。

7. 为什么 STL 需要迭代器?有指针不够吗?

7.1 迭代器的本质

  • 不是指针
  • 是一个 类模板
  • 重载了 * ++ -- ->

本质是指针的抽象与增强

7.2 为什么不用裸指针?

  • 不同容器内部结构不同
  • 迭代器 统一访问接口
  • 屏蔽容器内部实现

这就是 Iterator 设计模式

8. epoll 的工作原理?

8.1 接口顺序

epoll_create()
epoll_ctl()
epoll_wait()

8.2 内部原理

  • 所有 fd → 红黑树
  • 就绪 fd → 就绪链表
  • epoll_wait 只返回 活跃 fd

相比 select 的优势:

  • 不轮询
  • fd 无上限
  • 事件驱动

9. resize 和 reserve 的区别?

9.1 resize

  • 改变 size
  • 可能构造 / 析构对象
v.resize(10);

9.2 reserve

  • 改变 capacity
  • 不构造对象
v.reserve(10);

性能建议: 已知元素数量时,先 reserve 再 push_back。

10. 面试总结

  • map / set 底层是红黑树
  • unordered_map 是哈希表
  • allocator 解决内存碎片
  • vector erase 会导致迭代器失效
  • epoll 是事件驱动模型
  • reserve 提前分配,resize 改变元素数量

目录

  1. 1. map 和 set 有什么区别?是如何实现的?
  2. 1.1 相同点
  3. 1.2 不同点对比
  4. 1.3 为什么不能修改 key?
  5. 2. map 的 operator[] 为什么要慎用?
  6. 3. STL allocator 的作用是什么?
  7. 3.1 new/delete 的问题
  8. 3.2 allocator 的设计思想
  9. 3.3 SGI STL 的两级分配器
  10. 4. STL 中如何正确删除元素?
  11. 4.1 vector / deque
  12. 4.2 map / set
  13. 4.3 list
  14. 5. map 与 unordered_map 的区别?
  15. 6. vector 和 list 的区别?
  16. 7. 为什么 STL 需要迭代器?有指针不够吗?
  17. 7.1 迭代器的本质
  18. 7.2 为什么不用裸指针?
  19. 8. epoll 的工作原理?
  20. 8.1 接口顺序
  21. 8.2 内部原理
  22. 9. resize 和 reserve 的区别?
  23. 9.1 resize
  24. 9.2 reserve
  25. 10. 面试总结

更多推荐文章

查看全部
  • C++ 基础:RAII、智能指针与项目构建
  • C++ 继承入门:从基础概念到默认成员函数,掌握类复用核心
  • PySLAM 视觉定位库:Python 环境搭建与核心功能解析
  • 家庭 AI 助手实战:OpenClaw 接入 QQ 机器人
  • C++ 测试与调试:保障代码质量与稳定性
  • 三款主流云电脑部署 DeepSeek 大模型性能对比
  • Whisper-Large-V3-Turbo 语音识别模型一键部署指南
  • SpringBoot + PostGIS 城市道路里程计算与缓存优化实战
  • FPGA 与 IC 职业前景对比及选择建议
  • Qoder AI 编程工具:从部署到深度使用实战详解
  • CCF GESP C++ 8 级编程能力认证试题
  • OpenClaw 接入微信教程:一条命令把 AI 助手接进微信
  • Monster API:零代码微调大模型平台解析
  • C++ 继承机制详解:从概念到多继承模型
  • 火山引擎 GitHub Actions 结合对象存储与 CDN 部署静态网站
  • PHP 安装与配置教程
  • OpenCode 开源 AI 编程助手使用指南
  • 裴蜀定理与扩展欧几里得:从同余到逆元
  • Spring Boot 整合 Spring Security 构建安全 Web 应用
  • 堆数据结构基础与常用字符串处理算法实战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online