首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深入理解STL库_STL文件格式工作原理

微信公众号搜索:阿Q正砖 上期说过C++这块面试问东西也蛮多,简历上只要出现C++这几个字,那么STL库就是必问。 总不能是面试官问你了解STL库尴尬说这块不怎么熟悉。...所有STL容器都附带有自己专属迭代器——是的,只有容器设计者才知道如何遍历自己元素,原生指针(Native pointer)也是一种迭代器。...(3)deque控器 deque为了维持整体连续假象,设计一个控器,其用来记录deque内部每一段连续空间地址。...大体上可以理解为deque每一段连续空间分布在内存连续空间上,然后用一个所谓map作为主控,记录每一段内存空间入口,从而做到整体连续假象。...Map 类似于数据库1:1关系,是一种关联容器,提供一对一数据处理能力,这种特性使得map类似于数据结构红黑树。元素默认按键升序排序。如果迭代器所指向元素被删除,则该迭代器失效

54010

【C++100问】深度总结STL基本容器使用

4、顺序容器(Sequence containers) 4.1)常用操作(共同点) 1_添加元素 2_访问元素 3_删除元素 4_改变容器大小 5_容器操作可能使迭代器失效 向容器添加或删除元素可能会使指向容器元素指针...失效指针、引用或迭代器不再表示任何元素,使用它们一种严重程序设计错误。...如果容器是 deque 类型,添加到除首尾之外任何位置都会使迭代器、指针和引用失效。如果添加到首尾位置,则迭代器会失效指针和引用不会失效。...如果容器是 deque 类型,删除除首尾之外任何元素都会使迭代器、指针和引用失效。如果删除尾元素,则尾后迭代器失效,其他迭代器、指针和引用不受影响。如果删除首元素,这些也不会受影响。...设计目的是令容器任何位置添加和删除操作都很快速,作为代价不支持元素随机访问——为了访问一个元素,只能遍历整个容器。 优缺点: 优点:内存连续,动态操作,可在任意位置插入或删除且效率高。

1.1K31
您找到你想要的搜索结果了吗?
是的
没有找到

蒋豆芽面试题专栏总结(C++软件开发与嵌入式软件)完成了!

区别: (1)赋值:同类型指针变量可以相互赋值;数组不行,只能一个一个元素赋值或拷贝 (2)存储方式: 数组:数组在内存连续存放,开辟一块连续内存空间。...栈使用是一级缓存, 它们通常都是被调用时处于存储空间中,调用完毕立即释放;堆则是存放在二级缓存,速度要慢些。 堆栈数据结构不同。堆类似数组结构;栈类似栈结构,先进后出。...第二:分配内存指针以链表形式自行管理,使用完毕之后从链表删除,程序结束时可检查改链表。 第三:使用智能指针。...采用隐式链表所有空闲块,每一个空闲块记录了一个未分配连续内存地址。 什么是内存内存池也是一种对象池,我们在使用内存对象之前,先申请分配一定数量内存块留作备用。...⭐⭐⭐⭐⭐ 1.7 TCP与UDP区别?⭐⭐⭐⭐⭐ 1.8 TCP头部包含哪些内容?⭐⭐⭐⭐⭐ 1.9 TCP为什么要三次握手,两次?⭐⭐⭐⭐⭐ 1.10 TCP为什么要四次挥手,三次

1.9K41

C++ 顺序容器基础知识总结

删除元素后,指向被删除元素迭代器失效,这是显而易见。 6.deque 6.1.底层数据结构 vector是单向开口线性连续空间,deque则是一种双向开口连续数据空间。...deque内部数据结构到底如何?想必已经猜到了,要实现如上需求,需要由一段一段连续空间链接起来数据结构才能满足。 6.2.内存分配策略 接着上面讲。...deque采用一块map(非STLmap)作为主控,map是一块小连续空间,其中每个元素都是指针,指向一块较大线性连续空间,称为缓冲区。缓冲区才是存储deque元素空间主体。...6.4.迭代器失效问题 在deque容器首部或者尾部插入元素不会使得任何迭代器失效。 在其首部或尾部删除元素则只会使指向被删除元素迭代器失效。...在deque容器任何其他位置插入和删除操作将使指向该容器元素所有迭代器失效。 7.容器适配器 stack,也称为栈,是一种先进后出数据结构。STLstatck是一种容器适配器。

1.3K50

当谈论迭代器时,我谈些什么?

当我初学 Python 时候,我迭代器理解为一种能够放在“for xxx in …”“…”位置东西;后来随着学习深入,我了解到迭代器就是一种实现了迭代器协议对象;学习 C++ 时,我了解到迭代器是一种行为和指针类似的对象...;其次,由于迭代器是一种高度泛化实现,其需要在每一次迭代器移动时都做一些额外工作(如 Python 需要不断检测迭代器是否耗尽,并进行异常监测;C++ deque 容器需要对其在堆上用于存储多段连续内存进行衔接等...这些容器可以是一个连续内存数组或列表,或是一个多段连续内存 deque,甚至是一个完全不连续内存链表或是哈希表等等,我们完全不需要关注迭代器对于不同容器究竟是怎么取得数据。...由于迭代器本身并不是独立数据结构,而是指向其他数据结构泛化指针,故和普通指针一样,一旦指针指向内存发生变动,则迭代器也随之失效。...如果迭代器指向数据结构是只读,则显然,直到析构函数被调用,迭代器都不会失效。但如果迭代器所指向数据结构在其存在时发生了插入或删除操作,则迭代器将可能失效

48840

整理了70道C语言与C++常见问答题

16 简述C、C++程序编译内存分配情况 从静态存储区域分配: 内存在程序编译时就已经分配好,这块内存在程序整个运行期间都存在。速度快、不容易出错, 因为有系统会善后。...堆一般由程序员 分配释放, 若程序员释放,程序结束时可能由OS 回收。分配方式类似于链表。 它与本题中堆和栈是两回事。堆栈只是一种数据结构堆区和栈区是程序不同内存存储区域。...向下兼容性,把C++最基本对象单元规定为class不是struct,就是为了避免各种兼容性要求限制 对struct定义扩展使C语言代码能够更容易被移植到C++ 32 C++类内可以定义引用数据成员...weak_ptr 设计目的是为配合 shared_ptr 引入一种智能指针来协助 shared_ptr 工作, 它只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造, 它构造和析构不会引起引用记数增加或减少...57 list底层原理 ist底层是一个双向链表,使用链表存储数据,并不会将它们存储到一整块连续内存空间中。

3K01

一起长锈:4 默认不可变变量绑定与引用(从Java与C++转Rust之旅)

对于大型数据结构,使用引用可以避免昂贵拷贝操作。” 席双嘉:“能给我举个在Rust里变量引用默认不可变例子?” 贾克强:“没问题,让我们一起看看下面的代码。”...“C++ 和 Rust 解引用操作都非常相似,因为它们共享同样基本目的——通过指针或引用访问或修改其指向内存数据。”...“不过,尽管这两种语言在解引用操作基础功能上相似,它们在安全性、用法以及语言总体设计哲学上存在一些差异。”...“总结来说,尽管 C++ 和 Rust 解引用操作在表面上很相似,它们在语言设计内存安全保障、以及它们如何被用于实际编程中有着明显差异。”...内存管理与赋值无关 语义 由于所有权,借用和生命周期概念,更为复杂 更简单,只涉及值复制到内存 更简单,只涉及值复制到内存 Rust引用是一种借用数据方式,分为不可变引用(&T)和可变引用

17243

c++】深入剖析与动手实践:C++Stack与Queue艺术

在这种上下文中,“适配器模式”是一种设计模式用词。 在面向对象设计模式,适配器模式(Adapter Pattern)通常用来一个类接口转换成客户期望另一个接口。...适配器让那些由于接口兼容不能一起工作类可以一起工作 在容器类库设计(如标准模板库 STL 容器),适配器模式通常用于通过已有的容器类型(如vector, deque, list等),来实现某种特定抽象数据类型...(operator[]) 或一系列迭代器访问 deque 元素 迭代器失效:在两端添加或删除元素通常不会使迭代器失效,但是在 deque 除了首尾外任何位置插入或删除元素都可能使所有迭代器失效...内存分配:deque 不保证所有元素都连续存储,因此不能依赖像 std::vector 那样内存连续性 性能:在两端插入或删除元素通常是常数时间复杂度 O(1),但是在中间位置插入或删除元素时间复杂度通常是线性...::deque 常见实现方式是使用一系列固定大小数组(称为缓冲区或块),这些数组被指针所管理,这些指针通常保存在一个或多个中央数组

6710

20道必须掌握C++面试题

适用于:当一个类不知道它所必须创建对象时候;当一个类希望由它子类来指定它所创建对象时候;当类创建对象职责委托给多个帮助子类某一个,并且希望哪一个帮助子类是代理者这一信息局部化时候...它将容器和算法分开,好让这二者独立设计。 问7:数据结构?项目开发过程主要用到那些? 答:数据结构主要会用到数组,链表,树(较少),也会用到栈和队列思想。 问8:const知道?...所以调用这些对象速度要相对来得低一些。 三、堆栈数据结构区别: 堆(数据结构):堆可以被看成是一棵树,如:堆排序; 栈(数据结构):一种先进后出数据结构。 问11:C和C++区别?...面对内存泄漏和指针越界,有哪些方法?通常采用哪些方法来避免和减少这类错误? 答:用动态存储分配函数动态开辟空间,在使用完毕后未释放,结果导致一直占据该内存单元即为内存泄露。...因此C++语言需要一个完成动态内存分配和初始化工作运算符new,以一个完成清理与释放内存工作运算符delete。注意new/delete不是库函数。

53920

《逆袭进大厂》第四弹之C++重头戏STL30问30答

大小),在找到第个链表后查看链表是否为空,如果不为空直接从对应free_list拔出,已经拨出指针向后移动一位。...2) list数据结构 list是由双向链表实现,因此内存空间是连续。...但对数据插入和删除操作等都比较方便,改变指针指向即可。list是单向,vector是双向。vector迭代器在使用后就失效了,list迭代器在使用之后还可以继续使用。...这和C++智能指针很像,智能指针也是一个指针封装,然后通过引用计数或是其他方法完成自动释放内存功能。...我们没必要再为共享内存设计其他额外数据结构,另外,STL高度可扩展性将为IPC所驱使。STL容器被良好封装,默认情况下有它们自己内存管理方案。

1.5K20

c++ 迭代器失效_c++迭代器是什么

大家好,又见面了,我是你们朋友全栈君。 C++ 迭代器(Iterator) 1.1 定义 迭代器是一种检查容器内元素并遍历元素数据类型。...迭代器是一个变量,提供对一个容器对象(间接)访问方法,并且定义了容器对象范围。 迭代器可以指向容器某个元素,通过迭代器就可以对非数组(存储空间连续数据结构进行遍历。...如:容器有成员 begin 和 end ,其中begin成员复制返回指向第一个元素迭代器,end成员返回指向容器尾元素下一个位置迭代器,也就是说end指示是一个不存在元素,所以end返回是尾后迭代器...不能以指针来看待迭代器,指针是与内存绑定迭代器是与容器里元素绑定,删除了之后,该迭代器就失效了,在对其重新赋值之前,不能再访问此迭代器。...本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。如发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站立刻删除。

1K40

千万不要错过后端【纯干货】面试知识点整理 I

C++面试题 img 语言相关基础题 对象复用了解,零拷贝了解 对象复用 指的是设计模式,对象可以采用不同设计模式达到复用目的,最常见就是继承和组合模式了。...,操作系统会将程序当时内存状态记录下来,保存在一个文件,这种行为就叫做Core Dump....封装了指针一些行为,重载了指针++/--/->/*等操作符号,相当于一种智能指针。...可以根据不同数据结构,来实现 ++ 和 -- 操作 terator模式是运用于一种聚合对象模式,把不同集合内访问逻辑抽象出来,使得不暴露对象内部结构达到遍历集合效果 运用范围:底层聚合支持类...if (3 == *iter) valset.erase(iter++); else ++iter; } 对于list容器来说,是连续分配内存

50840

Linux 内存管理初探

尽量一次性申请较大内存不要反复申请小内存 尽可能申请大块 2 指数幂大小内存空间 外部碎片避免——伙伴系统算法 内部碎片避免——slab 算法 自己进行内存管理工作,设计内存池 2、伙伴系统算法...——组织结构 1) 概念 为内核提供了一种用于分配一组连续建立一种高效分配策略,并有效解决了外碎片问题 分配内存区是以页框为基本单位 2) 外部碎片 外部碎片指的是还没有被分配出去...操作系统首次引入一种算法 它基本思想是内核中经常使用对象放到高速缓存,并且由系统保持为初始可利用状态。...11、DMA 内存 1) 什么是 DMA 直接内存访问是一种硬件机制,它允许外围设备和主内存之间直接传输它们 I/O 数据,不需要系统处理器参与2) DMA 控制器功能 向 CPU...vmalloc建立非连续物理内存到虚拟地址映射物理连续,适合需要大内存,但是对地址连续性没有要求场合dma_alloc_coherent基于_alloc_pages 实现4MB适用于 DMA 操作

5K51

Linux 内存相关问题汇总

尽量一次性申请较大内存不要反复申请小内存 尽可能申请大块 2 指数幂大小内存空间 外部碎片避免——伙伴系统算法 内部碎片避免——slab 算法 自己进行内存管理工作,设计内存池 2、伙伴系统算法...——组织结构 1) 概念 为内核提供了一种用于分配一组连续建立一种高效分配策略,并有效解决了外碎片问题 分配内存区是以页框为基本单位 2) 外部碎片 外部碎片指的是还没有被分配出去...操作系统首次引入一种算法 它基本思想是内核中经常使用对象放到高速缓存,并且由系统保持为初始可利用状态。...11、DMA 内存 1) 什么是 DMA 直接内存访问是一种硬件机制,它允许外围设备和主内存之间直接传输它们 I/O 数据,不需要系统处理器参与2) DMA 控制器功能 向 CPU...扩展现有内存空间大小 a) 如果当前连续内存块足够 realloc 的话,只是 p 所指向空间扩大,并返回 p 指针地址。

1.8K30

Linux 内存相关问题汇总

尽量一次性申请较大内存不要反复申请小内存 尽可能申请大块 2 指数幂大小内存空间 外部碎片避免——伙伴系统算法 内部碎片避免——slab 算法 自己进行内存管理工作,设计内存池 2、伙伴系统算法...——组织结构 1) 概念 为内核提供了一种用于分配一组连续建立一种高效分配策略,并有效解决了外碎片问题 分配内存区是以页框为基本单位 2) 外部碎片 外部碎片指的是还没有被分配出去...操作系统首次引入一种算法 它基本思想是内核中经常使用对象放到高速缓存,并且由系统保持为初始可利用状态。...11、DMA 内存 1) 什么是 DMA 直接内存访问是一种硬件机制,它允许外围设备和主内存之间直接传输它们 I/O 数据,不需要系统处理器参与2) DMA 控制器功能 向 CPU...扩展现有内存空间大小 a) 如果当前连续内存块足够 realloc 的话,只是 p 所指向空间扩大,并返回 p 指针地址。

1.9K31

linux 内存管理初探

不要反复申请小内存 尽可能申请大块 2 指数幂大小内存空间 外部碎片避免——伙伴系统算法 内部碎片避免——slab 算法 自己进行内存管理工作,设计内存池 2、伙伴系统算法——组织结构 1...)    概念 为内核提供了一种用于分配一组连续建立一种高效分配策略,并有效解决了外碎片问题 分配内存区是以页框为基本单位 2)    外部碎片 外部碎片指的是还没有被分配出去(不属于任何进程...SunOS 操作系统首次引入一种算法 它基本思想是内核中经常使用对象放到高速缓存,并且由系统保持为初始可利用状态。...,它允许外围设备和主内存之间直接传输它们 I/O 数据,不需要系统处理器参与2)    DMA 控制器功能 向 CPU 发出系统保持(HOLD)信号,提出总线接管请求 当 CPU 发出允许接管信号后...vmalloc建立非连续物理内存到虚拟地址映射物理连续,适合需要大内存,但是对地址连续性没有要求场合dma_alloc_coherent基于_alloc_pages 实现4MB适用于 DMA 操作

9.8K134

C++面试题

C++ 基础 1. 引用和指针有什么区别? 一般指的是某块内存地址,通过这个地址,我们可以寻址到这块内存引用是一个变量别名。指针可以为空,引用不能为空。 2....析构函数同样也是成员函数,虚析构函数也会进入虚表,唯一不同是,函数名并不要求一致,而且,如果写,编译器也会帮你生成,而且如果基类有virtual,编译器也会默认给子类添加。...子类析构函数具有析构掉基类职责,所以不会造成内存泄漏。基类并不知道自己子类。 4. 构造函数和析构函数抛出异常? 不能。 5. 多继承存在什么问题?如何消除多继承二义性?...我们没必要再为共享内存设计其他额外数据结构,另外,STL高度可扩展性将为IPC所驱使。STL容器被良好封装,默认情况下有它们自己内存管理方案。...1) 栈由系统自动分配,堆是人为申请开辟; 2) 栈获得空间较小,堆获得空间较大; 3) 栈由系统自动分配,速度较快,堆一般速度比较慢; 4) 栈是连续空间,堆是连续空间。 5.

1.7K42

你们要C++面试题答案来了--基础篇

weak_ptr 设计目的是为配合 shared_ptr 引入一种智能指针来协助 shared_ptr 工作, 它只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造, 它构造和析构不会引起引用记数增加或减少...list拥有一段连续内存空间,如果需要高效插入和删除,不关心随机访问,则应使用list。...,相当于一种智能指针,他可以根据不同类型数据结构来实现不同++,--等操作。...其中当申请内存小于128K时,会使用系统函数brk在堆区中分配;当申请内存大于128K时,会使用系统函数mmap在映射区分配。 请你说一说C++内存管理是怎样?...这里空闲链表节点设计十分巧妙,这里用了一个联合体既可以表示下一个空闲数据块(存在于空闲链表地址,也可以表示已经被用户使用数据块(不存在空闲链表地址。

2.8K30

深入理解Linux内存子系统

设计内存池 2、伙伴系统算法——组织结构 1) 概念 为内核提供了一种用于分配一组连续建立一种高效分配策略,并有效解决了外碎片问题 分配内存区是以页框为基本单位 2)...SunOS 操作系统首次引入一种算法 它基本思想是内核中经常使用对象放到高速缓存,并且由系统保持为初始可利用状态。...1) 什么是 DMA 直接内存访问是一种硬件机制,它允许外围设备和主内存之间直接传输它们 I/O 数据,不需要系统处理器参与2) DMA 控制器功能 向 CPU 发出系统保持(HOLD...扩展现有内存空间大小 a) 如果当前连续内存块足够 realloc 的话,只是 p 所指向空间扩大,并返回 p 指针地址。...错误示例:删除当前迭代器,迭代器会失效 正确示例:迭代器 erase 时,需保存下一个迭代器 5、C++ 11 智能指针 auto_ptr 替换为 unique_ptr 使用make_shared

1.9K52

CC++工程师面试题(STL篇)

适用场景: vector: 适用于连续存储,支持随机访问,不在乎插入和删除效率。 list: 适用于连续内存空间,如果需要高效插入和删除,不关心随机访问。...简述 vector 实现原理 vector 是一种动态数组,在内存具有连续存储空间,支持快速随机访问,由于具有连续存储空间,所以在插入和删除操作方面,效率比较慢。...扩容以后它内存地址会发生改变 迭代器失效原因,有哪些情况 迭代器失效是指迭代器在遍历容器过程,由于容器结构发生改变导致迭代器指向元素不再有效。...以下是导致迭代器失效常见情况: 插入和删除操作: 当在容器插入或删除元素时,可能会导致容器内存重新分配或元素位置改变,这可能会使迭代器失效。...排序操作: 如果在排序过程,容器元素被移动了位置,迭代器可能会失效。 deque 实现原理 分段连续内存控器 deque 是由一段一段连续空间构成。

11900
领券