C++面试八股文:std::deque用过吗?

C++ std::sort() 深度解析:从基础用法到高级优化与实战避坑 排序是计算机科学中的基础算法,用于将数据元素按特定顺序重新排列,其核心原理基于比较和交换操作。高效的排序算法(如快速排序、归并排序)能显著提升数据处理性能,是优化搜索、准备二分查找等操作的前提。在C++工程实践中,标准库提供的 `std::sort` 函数是实现高效排序的通用工具,它基于泛型编程思想,通过迭代器抽象了具体容器,允许开发者通过自定义比较函数灵活定义排序规则,从而广泛应用于数据结构整理、算法预处理及性能优化等场景。本文聚焦于 `std::sort` 这一核心工具,深入探讨其背后的 **内省排序( 阅读详情

某日二师兄参加XXX科技公司的C++工程师开发岗位第26面:

面试官:deque用过吗?

二师兄:说实话,很少用,基本没用过。

面试官:为什么?

二师兄:因为使用它的场景很少,大部分需要性能、且需要自动扩容的时候使用vector,需要随机插入和删除的时候可以使用list。

面试官:那你知道STL中的stack是如何实现的吗?

二师兄:默认情况下,stack使用deque作为其底层容器,但也可以使用vector或list作为底层容器。

面试官:你觉得为什么STL中默认使用deque作为stack的底层容器吗?

二师兄:额。。(stack也不需要双端插入啊,不应该vector更好吗。。)不是很清楚。。

面试官:没关系。那你知道deque是如何实现的吗?

二师兄:与vector内存空间连续不同,deque是部分连续的。deque通常维护了一个map(不是std::map),map的每个元素指向一个固定大小的chunk。同时维护了两个指针,指向头chunk和尾chunk。在deque的头部或尾部插入元素时,deque会找到头部或尾部的指针,并通过指针找到对应的chunk。如果chunk中还有未被元素填充的位置,则将元素填充到数组中,如果此指针指向的chunk已经被元素填满,则需要重新开辟一块固定大小的chunk,并将chunk记录在map中。

file

面试官:deque的查找、插入、删除的时间复杂度是什么?

二师兄:dqueue查找的时间复杂度是O(N),插入要分情况,如果是头插和尾插,时间复杂度为O(1),如果是中间插入,则是O(N)。删除元素和插入元素的时间复杂度相同。

面试官:好的。面试结束,回去等通知吧。

让我们来看一下二师兄的表现:

为什么STL中默认使用deque作为stack的底层容器吗?

STL默认选择deque最为stack的底层容器肯定是有原因的。vector和list同样可以作为deque的底层容器,让我们比较一下三个容器的差异:(只考虑头插和尾插,因为stack不需要随机插入)

dequevectorlist
插入O(1)O(1)O(1)
删除O(1)O(1)O(1)

从上表中看到,三种容器的插入和是删除的时间复杂度相同。

但是如果连续插入时,情况发生变化。vector的capacity被耗尽,元素发生搬移。

list倒没有这个顾虑,但是当元素尺寸很小时,list的空间利用率太低。

deque虽然遍历效率不如vector、随机插入效率不然list,但stack并不需要这两种操作,所以deque是stack底层容器的最佳选择。

今天的面试分享到这里就结束了,让我们继续期待二师兄的表现吧。

关注我,带你21天“精通”C++!(狗头)

C++面试八股文:std::vector和std::list,如何选择? 它的底层是单向链表,引入它的主要目的是为了达到手写链表的性能。指针指向的对象,而不需要移动元素的位置,所以不会导致迭代器失效。这里二师兄回答的倒是没有毛病,但是没有考虑到缓存问题。底层采用数组存储数据,所以它的空间局部性更好,对缓存更友好(被称为双向链表,和C中手写双向链表本质上没有大的区别。二师兄:并不会,因为在任意位置添加和删除元素只需要改变。在随机插入数据不会导致数据的搬移。二师兄:不是,GCC中的实现只有在。二师兄:与手写双向链表不同的是, 阅读详情

相关推荐

C++ STL容器深度解析:list与deque原理、性能对比与实战应用

在C++标准模板库中,容器是构建高效程序的基础数据结构。理解不同容器的底层实现原理,是进行性能优化和正确选型的关键。链表结构通过节点指针连接实现元素的离散存储,其优势在于任意位置的常数时间插入与删除,但代价是随机访问效率低下且缓存不友好;而双端队列采用分段连续的数组结构,在保证头尾高效操作的同时,提供了接近常数的随机访问能力,是连续存储与链表特性的折中方案。这些特性直接决定了它们的技术价值:list适用于元素移动成本高、迭代器稳定性要求严苛的场景,如LRU缓存;deque则擅长作为需要双向扩展的队列或缓冲区

weixin_29698641的博客 315

334-面经6

deque底层是动态开辟的二维数组 定义的2个宏:(不同的VS,g++,都有更改值) #define MAP_SIZE 2 #define QUE_SIZE(T) 4096/sizeof(T)一维数组的初始大小 MAP_SIZE (T*) 第二维数组默认开辟的大小就是QUE_SIZE(int) 1024 deque是双端队列 两端都有队头和队尾 两端都可以插入删除时间复杂度是O(1) 当第一维所有的位置都开辟了第二维,再增加元素的话就要扩容扩容: 把第一维数组按照2倍的方式进行扩容 2-4-8-16。。。扩

Edward_LF的博客 177

华为OD C++面试指南:从八股文到实战,助你攻克算法与系统设计

在软件开发领域,扎实的计算机基础是构建复杂系统的基石。理解核心编程概念,如面向对象、内存管理和数据结构,是高效编码的前提。这些原理直接决定了程序的性能、稳定性和可维护性,其技术价值在于能够帮助开发者设计出健壮、可扩展的软件架构。在诸如后端服务、高性能计算等应用场景中,对C++语言特性、标准模板库(STL)底层实现以及操作系统、计算机网络知识的深度掌握,是解决实际工程问题的关键。本文聚焦于华为OD C++岗位的实战面试,深入解析包括虚函数表(vtable)、TCP滑动窗口在内的核心八股文考点,并提供从机试算法

dianzongfan5428的博客 387

C++容器选型指南:深入理解list与deque的核心原理与应用场景

在C++标准库中,顺序容器是构建数据结构的基础组件,其性能表现直接影响程序效率。从数据结构原理来看,连续内存布局与链式结构决定了容器的核心特性。连续内存容器如vector通过数组实现,提供极佳的缓存局部性和随机访问性能,但中间插入删除成本高;链式结构如list采用双向链表,支持O(1)的任意位置插入删除,但牺牲了内存连续性和遍历速度。在工程实践中,容器选型需要权衡时间复杂度、内存布局和缓存友好性。deque作为动态分段数组,巧妙结合了数组和链表的优势,在两端操作和随机访问间取得平衡,成为队列场景的理想选择。

weixin_33831673的博客 458

C++面试八股文结构化应答模板:从知识点到逻辑表达

在软件工程实践中,扎实的计算机基础与清晰的技术表达能力是开发者核心竞争力的体现。C++作为高性能后端开发的主流语言,其内存管理、对象模型、并发编程等核心机制是面试考察的重点。理解这些机制的原理,如RAII资源管理、虚函数表实现多态、智能指针的引用计数等,不仅关乎代码的正确性与效率,更直接影响系统在高并发、低延迟场景下的稳定表现。掌握从概念原理到应用场景的完整阐述逻辑,能帮助开发者在技术面试中稳定、全面地展示实力。本文针对C++后端面试中常见的‘八股文’问题,提供一套结构化的‘默写模板’思维框架,旨在将零散的

weixin_30516243的博客 388

C++ STL std::list 深度解析:从双向链表原理到高性能实战应用

在C++标准模板库(STL)中,容器是构建高效程序的基础组件。双向链表作为一种经典的数据结构,通过节点指针链接实现元素的非连续存储,其核心原理在于插入和删除操作的时间复杂度为O(1),且能保持迭代器的稳定性。这一特性在需要频繁修改序列、维护长期有效引用的场景中具有极高的技术价值,例如实现LRU缓存、实时游戏对象管理或复杂图算法中的邻接表。相较于 `std::vector` 的动态数组,`std::list` 在中间位置增删元素时无需移动后续元素,避免了迭代器失效问题,但其随机访问性能较差。本文将深入探讨 `

weixin_42662293的博客 326

C++栈与队列:从STL容器适配器到模拟实现与性能优化

栈和队列是计算机科学中两种基础且核心的数据结构,分别遵循后进先出(LIFO)和先进先出(FIFO)的访问原则。其原理决定了它们在管理数据访问顺序上的独特价值,广泛应用于函数调用栈、任务调度、算法实现(如BFS/DFS)等场景。在C++标准模板库(STL)中,`std::stack`和`std::queue`被设计为容器适配器,通过封装底层容器(如`deque`、`vector`)来提供特定的数据访问语义,这体现了**STL**强大的泛型编程思想。理解其作为**容器适配器**的设计,不仅能帮助开发者正确选用数

weixin_42567752的博客 216

深入剖析C++ std::alloc:内存池、自由链表与高性能内存管理

内存管理是编程语言的核心基础,它决定了程序如何高效、安全地使用系统资源。其原理涉及从操作系统申请内存、组织内存结构到最终释放的完整生命周期。在C++中,标准库通过分配器(Allocator)抽象封装了这一过程,其技术价值在于平衡性能、内存碎片与跨平台兼容性。一个典型的高性能实现会采用内存池(Memory Pool)技术,结合自由链表(Free List)管理固定大小的内存块,从而为频繁操作的小对象提供常数时间的分配与释放速度,并显著提升缓存局部性。这种设计广泛应用于标准容器(如vector、map)底层,以

weixin_32576389的博客 338

C++ std::list深度解析:双向链表原理、性能与应用场景

在C++标准模板库(STL)中,容器是管理数据集合的核心组件,其选择直接影响程序的性能和内存效率。序列容器如vector、deque和list各有其设计哲学与底层实现原理。其中,std::list基于双向循环链表实现,其核心优势在于任何位置的插入与删除操作都能在常数时间内完成,且迭代器在元素未被删除时保持稳定,这源于其通过节点指针链接的非连续内存结构。这一特性使其在处理需要频繁在序列中间进行修改、或要求迭代器持久有效的场景中具有独特技术价值,例如实现LRU缓存、高频更新的任务队列或需要稳定元素引用的复杂数据

weixin_28683689的博客 313

深入解析C++ STL list:双向链表实现原理与性能优化实战

在C++标准模板库中,容器是构建高效程序的基础组件。序列容器通过不同的数据结构组织元素,其中链表结构以其独特的节点链接方式,实现了任意位置的常数时间插入与删除操作。这种设计原理源于双向链表的数据结构,每个节点独立分配内存并通过指针连接,从而避免了元素移动的开销。其技术价值在于提供了稳定的迭代器语义,插入操作不会使任何现有迭代器失效,这在需要长期持有元素引用的场景中至关重要。典型的应用场景包括需要频繁在序列中间进行增删的任务队列、LRU缓存实现以及元素对象较大且拷贝成本高的数据管理。本文以std::list为

dgoh41514的博客 419

C++编译错误‘vector‘ does not name a type:从环境配置到STL容器的完整解决方案

在C++编程中,头文件包含和命名空间管理是基础且关键的概念,它们直接关系到编译器能否正确识别代码中的标识符。其原理在于,C++标准库的所有组件都封装在特定的头文件和std命名空间中,编译器需要明确的指引来定位这些定义。掌握这些机制的技术价值在于,能够避免常见的编译错误,并编写出符合现代C++工程实践的高质量代码。这一知识在多种应用场景中至关重要,例如在配置VSCode、CLion等集成开发环境时,或是在处理多文件项目中的依赖关系时。本文聚焦于解决典型的‘vector‘ does not name a typ

hqmln的博客 756

C++ deque::erase() 函数深度解析:安全删除与迭代器失效陷阱

在C++标准库中,容器操作是构建高效程序的基础。以双端队列(deque)为例,它结合了vector的随机访问和list的头尾操作优势,其底层通常由多个固定大小的内存块组成。当执行删除操作时,特别是erase()函数,会引发元素移动和内存布局调整,这直接关系到迭代器、指针和引用的有效性——即“迭代器失效”问题。理解这一原理对于编写健壮代码至关重要,它能避免程序崩溃或未定义行为。从技术价值看,掌握安全的删除模式(如利用erase返回值更新迭代器)和高效惯用法(如erase-remove),能显著提升程序稳定性和

weixin_33937913的博客 422

华为od 面试八股文_C++_09_含答案

华为od 面试八股文_C++_09_含答案

MISAYAONE的博客 535

深入理解C++ std::list:从核心原理到模拟实现

在C++标准模板库(STL)中,容器是数据结构的核心抽象,为开发者提供了高效、通用的数据管理工具。其设计基于迭代器、算法与容器的分离原则,通过泛型编程实现类型安全与代码复用。双向链表作为一种基础数据结构,通过节点指针链接实现元素的非连续存储,支持在任意位置进行常数时间的插入与删除操作,这一特性使其在需要频繁修改序列的场景中具有独特价值。从工程实践角度看,理解容器的底层实现机制,特别是迭代器封装与内存管理,对于编写高性能、可维护的C++代码至关重要。例如,在实现自定义数据结构或优化关键路径性能时,掌握类似`s

weixin_33600816的博客 352

OMI数据获取与可视化:从下载到大气污染分析

本文详细介绍了如何获取与处理OMI卫星数据,以进行大气污染分析。内容涵盖从NASA GES DISC官方源下载对流层NO2数据、使用MATLAB或Python进行月均数据处理与网格化,到利用m_map或cartopy工具进行专业可视化的完整流程。重点解析了数据下载技巧、NetCDF格式处理、地图投影与填色方法,并探讨了时间序列分析与动态可视化等深度应用,为环境研究者提供了一套从数据到洞察的实用指南。

weixin_29210759的博客 269

LVDS系列11:Xilinx Ultrascale系可编程输入延迟(一)

按照IDELAYCTRL的参考时钟频率可以准确计算获取到,如200M参考时钟抽头分辨率为78ps,Ultrascale系列相对于7系列架构大改,体现便是U/U+系列的抽头增加到512个,同时每个抽头的分辨率就无法像7系列那样能得到一个准确的值,是一个波动的范围值,抽头分辨率随着工艺温度电压的变化而变化。EN_VTC:电压温度补偿开启的使用信号,COUNT模式下不能使用,必须保持为0,TIME模式下需要使用,在延迟工作时要启用温度电压补偿,在修改抽头值时需要关闭温度电压补偿,修改完后启用;

weixin_38828382的博客 1941

C++ std::list 实战指南:双向链表容器的核心特性与高效应用

在C++标准模板库(STL)中,容器是管理数据集合的基础组件,其选型直接影响程序的性能与稳定性。顺序容器如vector、deque和list各有其底层实现原理与适用场景。其中,基于双向链表实现的std::list,其核心优势在于任何已知位置的插入与删除操作都能在常数时间复杂度(O(1))内完成,并且迭代器具有极强的稳定性——只要元素未被删除,指向它的迭代器、引用或指针在容器结构调整后依然有效。这一技术价值使其在需要频繁进行元素重组、且需保持外部引用长期有效的场景中无可替代,例如实现LRU缓存淘汰算法、管理实

weixin_29913663的博客 235

Bartender 2021破解版安装教程:手把手教你从下载到激活(附详细步骤图)

本文详细介绍了BarTender 2021专业版的安装与高效应用指南,从基础配置到高级条码设计,帮助用户快速掌握标签设计与打印技术。内容涵盖安装步骤、标签模板创建、数据连接与批量打印技巧,以及高级功能如安全策略与自动化集成,适合零售、物流、制造等行业用户提升工作效率。

p4q5r6s7t的博客 2646

C++面试核心:从虚函数表到智能指针的实战指南

在C++编程中,理解核心概念如虚函数表(vtable)和智能指针是掌握语言精髓的关键。虚函数表通过运行时动态绑定实现多态,其机制涉及对象内存布局和虚函数指针,这是面向对象设计的基石。智能指针则基于RAII原则,自动管理内存生命周期,其中shared_ptr的引用计数机制和weak_ptr解决循环引用问题,体现了现代C++资源管理的核心思想。这些技术不仅提升了代码的安全性和性能,还在高性能服务、游戏引擎等场景中广泛应用。本文聚焦C++面试高频考点,深入解析虚函数表实现原理与智能指针的实战应用,帮助开发者构建扎

weixin_33883104的博客 243

YOLOv11【第二十章:模型迭代与生态闭环篇·第1节】在线增量学习——部署后新数据自动回流重训!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 432

AFSim2.9.0学习笔记 —— 2、AFSim的Wizard软件概述(ArkSIM集成开发环境 (IDE))

AFSim2.9.0学习笔记 —— 2、AFSim的Wizard软件详述(ArkSIM集成开发环境 (IDE))

922

【2026年9月】最新计算机专业面试八股文(全体系总结)

本八股文适配2026年春招/秋招/社招最新面试趋势,覆盖通用基础、主流开发专项、工程架构、前沿技术、算法核心五大核心模块,标注高频考点与2026年新增超高频考点,兼顾系统性、应试性与实战落地性。

小江的记录本 1万+

pip install安装markitdown时出现ERROR: ‘packages/markitdown[all]‘ is not a valid editable requirement解决方案

本文主要介绍了pip install安装markitdown时出现ERROR: ‘packages/markitdown[all]’ is not a valid editable requirement解决方案,希望能对使用markitdown的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 2万+

手写C++11线程池:从零实现生产级并发基座

线程池是现代C++并发编程的核心基础设施,其本质是基于生产者-消费者模型的资源受控任务调度机制。依托C++11标准提供的std::thread、std::mutex、std::condition_variable和std::packaged_task等原语,可构建线程安全、异常可传播、内存有界的轻量级实现。技术价值在于消除线程频繁创建销毁开销、防止OOM与死锁、保障异常隔离与结果可获取,广泛应用于图像处理、日志分析、API聚合等IO/CPU混合型场景。本文聚焦C++11原生能力落地,详解有界队列设计、移动语

diaoju3333的博客 297

教你写出高质量SQL(实践必备)

1、查询SQL尽量不要使用select * ,而是select具体字段。 //反例子 select * from sys_user; //正例子 select id,name from sys_user; 理由: 只取需要的字段,节省资源、减少网络开销;select * 进行查询时,很可能就不会使用到覆盖索引,就会造成回表查询; 覆盖索引:只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。 例如: 回表查询:先通过普通索引的值定位聚簇索引值,再通过聚簇索引的值定位行记..

ANGEL CITY 9996

RT-DETR模型应用过程中的报错处理及疑问解答,涉及环境搭建、模型训练、模块改进、论文写作

本文记录了RT-DETR模型的这一系列过程中可能发生的问题,以及大家非常关心的问题,这里统一做了一个记录和解答。

Limiiiing的博客 1766
上一篇: C++面试八股文:std::array如何实现编译器排序?
下一篇: C++面试八股文:用过std::set/std::map吗?
二进制架构
博客等级 码龄3年 10粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二进制架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值