微信公众号搜索:阿Q正砖 上期说过C++这块面试问的东西也蛮多,简历上只要出现C++这几个字,那么STL库就是必问。 总不能是面试官问你了解STL库吗?你尴尬的说这块不怎么熟悉。...所有STL容器都附带有自己专属的迭代器——是的,只有容器设计者才知道如何遍历自己的元素,原生指针(Native pointer)也是一种迭代器。...(3)deque的中控器 deque为了维持整体连续的假象,设计一个中控器,其用来记录deque内部每一段连续空间的地址。...大体上可以理解为deque中的每一段连续空间分布在内存的不连续空间上,然后用一个所谓的map作为主控,记录每一段内存空间的入口,从而做到整体连续的假象。...Map 类似于数据库中1:1关系,是一种关联容器,提供一对一的数据处理能力,这种特性使得map类似于数据结构中红黑树。元素默认按键的升序排序。如果迭代器所指向的元素被删除,则该迭代器失效。
4、顺序容器(Sequence containers) 4.1)常用操作(共同点) 1_添加元素 2_访问元素 3_删除元素 4_改变容器大小 5_容器操作可能使迭代器失效 向容器中添加或删除元素可能会使指向容器元素的指针...失效的指针、引用或迭代器不再表示任何元素,使用它们是一种严重的程序设计错误。...如果容器是 deque 类型,添加到除首尾之外的任何位置都会使迭代器、指针和引用失效。如果添加到首尾位置,则迭代器会失效,而指针和引用不会失效。...如果容器是 deque 类型,删除除首尾之外的任何元素都会使迭代器、指针和引用失效。如果删除尾元素,则尾后迭代器失效,其他迭代器、指针和引用不受影响。如果删除首元素,这些也不会受影响。...设计目的是令容器任何位置的添加和删除操作都很快速,作为代价不支持元素的随机访问——为了访问一个元素,只能遍历整个容器。 优缺点: 优点:内存不连续,动态操作,可在任意位置插入或删除且效率高。
区别: (1)赋值:同类型指针变量可以相互赋值;数组不行,只能一个一个元素的赋值或拷贝 (2)存储方式: 数组:数组在内存中是连续存放的,开辟一块连续的内存空间。...栈使用的是一级缓存, 它们通常都是被调用时处于存储空间中,调用完毕立即释放;堆则是存放在二级缓存中,速度要慢些。 堆栈数据结构不同。堆类似数组结构;栈类似栈结构,先进后出。...第二:将分配的内存的指针以链表的形式自行管理,使用完毕之后从链表中删除,程序结束时可检查改链表。 第三:使用智能指针。...采用隐式链表将所有空闲块,每一个空闲块记录了一个未分配的、连续的内存地址。 什么是内存池 内存池也是一种对象池,我们在使用内存对象之前,先申请分配一定数量的内存块留作备用。...⭐⭐⭐⭐⭐ 1.7 TCP与UDP的区别?⭐⭐⭐⭐⭐ 1.8 TCP头部包含哪些内容?⭐⭐⭐⭐⭐ 1.9 TCP为什么要三次握手,能两次吗?⭐⭐⭐⭐⭐ 1.10 TCP为什么要四次挥手,能三次吗?
删除元素后,指向被删除元素的迭代器失效,这是显而易见的。 6.deque 6.1.底层数据结构 vector是单向开口的线性连续空间,deque则是一种双向开口的连续数据空间。...deque的内部数据结构到底如何?想必你已经猜到了,要实现如上需求,需要由一段一段的连续空间链接起来的数据结构才能满足。 6.2.内存分配策略 接着上面讲。...deque采用一块map(非STL中的map)作为主控,map是一块小的连续空间,其中每个元素都是指针,指向一块较大的线性连续空间,称为缓冲区。而缓冲区才是存储deque元素的空间主体。...6.4.迭代器失效问题 在deque容器首部或者尾部插入元素不会使得任何迭代器失效。 在其首部或尾部删除元素则只会使指向被删除元素的迭代器失效。...在deque容器的任何其他位置的插入和删除操作将使指向该容器元素的所有迭代器失效。 7.容器适配器 stack,也称为栈,是一种先进后出的数据结构。STL中的statck是一种容器适配器。
当我初学 Python 的时候,我将迭代器理解为一种能够放在“for xxx in …”的“…”位置的东西;后来随着学习的深入,我了解到迭代器就是一种实现了迭代器协议的对象;学习 C++ 时,我了解到迭代器是一种行为和指针类似的对象...;其次,由于迭代器是一种高度泛化的实现,其需要在每一次迭代器移动时都做一些额外工作(如 Python 需要不断检测迭代器是否耗尽,并进行异常监测;C++ 的 deque 容器需要对其在堆上用于存储的多段不连续内存进行衔接等...这些容器可以是一个连续内存的数组或列表,或是一个多段连续内存的 deque,甚至是一个完全不连续内存的链表或是哈希表等等,我们完全不需要关注迭代器对于不同的容器究竟是怎么取得数据的。...由于迭代器本身并不是独立的数据结构,而是指向其他数据结构中的值的泛化指针,故和普通指针一样,一旦指针指向的内存发生变动,则迭代器也将随之失效。...如果迭代器指向的数据结构是只读的,则显然,直到析构函数被调用,迭代器都不会失效。但如果迭代器所指向的数据结构在其存在时发生了插入或删除操作,则迭代器将可能失效。
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的底层是一个双向链表,使用链表存储数据,并不会将它们存储到一整块连续的内存空间中。
对于大型数据结构,使用引用可以避免昂贵的拷贝操作。” 席双嘉:“你能给我举个在Rust里变量引用默认不可变的例子吗?” 贾克强:“没问题,让我们一起看看下面的代码。”...“C++ 和 Rust 中的解引用操作都非常相似,因为它们共享同样的基本目的——通过指针或引用访问或修改其指向的内存中的数据。”...“不过,尽管这两种语言在解引用操作的基础功能上相似,它们在安全性、用法以及语言的总体设计哲学上存在一些差异。”...“总结来说,尽管 C++ 和 Rust 的解引用操作在表面上很相似,它们在语言的设计、内存安全保障、以及它们如何被用于实际编程中有着明显的差异。”...内存管理与赋值无关 语义 由于所有权,借用和生命周期的概念,更为复杂 更简单,只涉及将值复制到内存中 更简单,只涉及将值复制到内存中 Rust的引用是一种借用数据的方式,分为不可变引用(&T)和可变引用
在这种上下文中,“适配器模式”是一种设计模式的用词。 在面向对象的设计模式中,适配器模式(Adapter Pattern)通常用来将一个类的接口转换成客户期望的另一个接口。...适配器让那些由于接口不兼容而不能一起工作的类可以一起工作 在容器类库设计中(如标准模板库 STL 中的容器),适配器模式通常用于通过已有的容器类型(如vector, deque, list等),来实现某种特定的抽象数据类型...(operator[]) 或一系列迭代器访问 deque 中的元素 迭代器失效:在两端添加或删除元素通常不会使迭代器失效,但是在 deque 中除了首尾外的任何位置插入或删除元素都可能使所有迭代器失效...内存分配:deque 不保证所有元素都连续存储,因此不能依赖像 std::vector 那样的内存连续性 性能:在两端插入或删除元素通常是常数时间复杂度 O(1),但是在中间位置插入或删除元素的时间复杂度通常是线性的...::deque 的常见实现方式是使用一系列的固定大小的数组(称为缓冲区或块),这些数组被指针所管理,这些指针通常保存在一个或多个中央数组中。
适用于:当一个类不知道它所必须创建的对象的类的时候;当一个类希望由它的子类来指定它所创建的对象的时候;当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候...它将容器和算法分开,好让这二者独立设计。 问7:数据结构会吗?项目开发过程中主要用到那些? 答:数据结构中主要会用到数组,链表,树(较少),也会用到栈和队列的思想。 问8:const知道吗?...所以调用这些对象的速度要相对来得低一些。 三、堆栈数据结构区别: 堆(数据结构):堆可以被看成是一棵树,如:堆排序; 栈(数据结构):一种先进后出的数据结构。 问11:C和C++的区别?...面对内存泄漏和指针越界,你有哪些方法?你通常采用哪些方法来避免和减少这类错误? 答:用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元即为内存泄露。...因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
大小),在找到第你个链表后查看链表是否为空,如果不为空直接从对应的free_list中拔出,将已经拨出的指针向后移动一位。...2) list数据结构 list是由双向链表实现的,因此内存空间是不连续的。...但对数据的插入和删除操作等都比较方便,改变指针的指向即可。list是单向的,vector是双向的。vector中的迭代器在使用后就失效了,而list的迭代器在使用之后还可以继续使用。...这和C++中的智能指针很像,智能指针也是将一个指针封装,然后通过引用计数或是其他方法完成自动释放内存的功能。...我们没必要再为共享内存设计其他额外的数据结构,另外,STL的高度可扩展性将为IPC所驱使。STL容器被良好的封装,默认情况下有它们自己的内存管理方案。
大家好,又见面了,我是你们的朋友全栈君。 C++ 迭代器(Iterator) 1.1 定义 迭代器是一种检查容器内元素并遍历元素的数据类型。...迭代器是一个变量,提供对一个容器中的对象的(间接)访问方法,并且定义了容器中对象的范围。 迭代器可以指向容器中的某个元素,通过迭代器就可以对非数组(存储空间不连续)的数据结构进行遍历。...如:容器有成员 begin 和 end ,其中begin成员复制返回指向第一个元素的迭代器,而end成员返回指向容器尾元素的下一个位置的迭代器,也就是说end指示的是一个不存在的元素,所以end返回的是尾后迭代器...不能以指针来看待迭代器,指针是与内存绑定的,而迭代器是与容器里的元素绑定的,删除了之后,该迭代器就失效了,在对其重新赋值之前,不能再访问此迭代器。...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
C++面试题 img 语言相关基础题 对象复用的了解,零拷贝的了解 对象复用 指的是设计模式,对象可以采用不同的设计模式达到复用的目的,最常见的就是继承和组合模式了。...,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump....封装了指针的一些行为,重载了指针的++/--/->/*等操作符号,相当于一种智能指针。...可以根据不同的数据结构,来实现 ++ 和 -- 操作 terator模式是运用于一种聚合对象的模式,把不同集合内的访问逻辑抽象出来,使得不暴露对象的内部结构而达到遍历集合的效果 运用范围:底层聚合支持类...if (3 == *iter) valset.erase(iter++); else ++iter; } 对于list容器来说,是不连续分配的内存
尽量一次性申请较大的内存,而不要反复申请小内存 尽可能申请大块的 2 的指数幂大小的内存空间 外部碎片避免——伙伴系统算法 内部碎片避免——slab 算法 自己进行内存管理工作,设计内存池 2、伙伴系统算法...——组织结构 1) 概念 为内核提供了一种用于分配一组连续的页而建立的一种高效的分配策略,并有效的解决了外碎片问题 分配的内存区是以页框为基本单位的 2) 外部碎片 外部碎片指的是还没有被分配出去...操作系统首次引入的一种算法 它的基本思想是将内核中经常使用的对象放到高速缓存中,并且由系统保持为初始的可利用状态。...11、DMA 内存 1) 什么是 DMA 直接内存访问是一种硬件机制,它允许外围设备和主内存之间直接传输它们的 I/O 数据,而不需要系统处理器的参与2) DMA 控制器的功能 能向 CPU...vmalloc建立非连续物理内存到虚拟地址的映射物理不连续,适合需要大内存,但是对地址连续性没有要求的场合dma_alloc_coherent基于_alloc_pages 实现4MB适用于 DMA 操作
尽量一次性申请较大的内存,而不要反复申请小内存 尽可能申请大块的 2 的指数幂大小的内存空间 外部碎片避免——伙伴系统算法 内部碎片避免——slab 算法 自己进行内存管理工作,设计内存池 2、伙伴系统算法...——组织结构 1) 概念 为内核提供了一种用于分配一组连续的页而建立的一种高效的分配策略,并有效的解决了外碎片问题 分配的内存区是以页框为基本单位的 2) 外部碎片 外部碎片指的是还没有被分配出去...操作系统首次引入的一种算法 它的基本思想是将内核中经常使用的对象放到高速缓存中,并且由系统保持为初始的可利用状态。...11、DMA 内存 1) 什么是 DMA 直接内存访问是一种硬件机制,它允许外围设备和主内存之间直接传输它们的 I/O 数据,而不需要系统处理器的参与2) DMA 控制器的功能 能向 CPU...扩展现有内存空间大小 a) 如果当前连续内存块足够 realloc 的话,只是将 p 所指向的空间扩大,并返回 p 的指针地址。
,而不要反复申请小内存 尽可能申请大块的 2 的指数幂大小的内存空间 外部碎片避免——伙伴系统算法 内部碎片避免——slab 算法 自己进行内存管理工作,设计内存池 2、伙伴系统算法——组织结构 1...) 概念 为内核提供了一种用于分配一组连续的页而建立的一种高效的分配策略,并有效的解决了外碎片问题 分配的内存区是以页框为基本单位的 2) 外部碎片 外部碎片指的是还没有被分配出去(不属于任何进程...SunOS 操作系统首次引入的一种算法 它的基本思想是将内核中经常使用的对象放到高速缓存中,并且由系统保持为初始的可利用状态。...,它允许外围设备和主内存之间直接传输它们的 I/O 数据,而不需要系统处理器的参与2) DMA 控制器的功能 能向 CPU 发出系统保持(HOLD)信号,提出总线接管请求 当 CPU 发出允许接管信号后...vmalloc建立非连续物理内存到虚拟地址的映射物理不连续,适合需要大内存,但是对地址连续性没有要求的场合dma_alloc_coherent基于_alloc_pages 实现4MB适用于 DMA 操作
C++ 基础 1. 引用和指针有什么区别? 一般指的是某块内存的地址,通过这个地址,我们可以寻址到这块内存;而引用是一个变量的别名。指针可以为空,引用不能为空。 2....而析构函数同样也是成员函数,虚析构函数也会进入虚表,唯一不同的是,函数名并不要求一致,而且,你如果不写,编译器也会帮你生成,而且如果基类有virtual,编译器也会默认给子类添加。...而子类析构函数具有析构掉基类的职责,所以不会造成内存泄漏。而基类并不知道自己的子类。 4. 构造函数和析构函数能抛出异常吗? 不能。 5. 多继承存在什么问题?如何消除多继承中的二义性?...我们没必要再为共享内存设计其他额外的数据结构,另外,STL的高度可扩展性将为IPC所驱使。STL容器被良好的封装,默认情况下有它们自己的内存管理方案。...1) 栈由系统自动分配,而堆是人为申请开辟; 2) 栈获得的空间较小,而堆获得的空间较大; 3) 栈由系统自动分配,速度较快,而堆一般速度比较慢; 4) 栈是连续的空间,而堆是不连续的空间。 5.
weak_ptr 设计的目的是为配合 shared_ptr 而引入的一种智能指针来协助 shared_ptr 工作, 它只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造, 它的构造和析构不会引起引用记数的增加或减少...list拥有一段不连续的内存空间,如果需要高效的插入和删除,而不关心随机访问,则应使用list。...,相当于一种智能指针,他可以根据不同类型的数据结构来实现不同的++,--等操作。...其中当申请内存小于128K时,会使用系统函数brk在堆区中分配;而当申请内存大于128K时,会使用系统函数mmap在映射区分配。 请你说一说C++的内存管理是怎样的?...这里空闲链表节点的设计十分巧妙,这里用了一个联合体既可以表示下一个空闲数据块(存在于空闲链表中)的地址,也可以表示已经被用户使用的数据块(不存在空闲链表中)的地址。
,设计内存池 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
适用场景: vector: 适用于连续存储,支持随机访问,而不在乎插入和删除的效率。 list: 适用于不连续的内存空间,如果需要高效的插入和删除,而不关心随机访问。...简述 vector 的实现原理 vector 是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问,由于具有连续的存储空间,所以在插入和删除操作方面,效率比较慢。...扩容以后它的内存地址会发生改变 迭代器失效原因,有哪些情况 迭代器失效是指迭代器在遍历容器过程中,由于容器的结构发生改变而导致迭代器指向的元素不再有效。...以下是导致迭代器失效的常见情况: 插入和删除操作: 当在容器中插入或删除元素时,可能会导致容器内存重新分配或元素位置的改变,这可能会使迭代器失效。...排序操作: 如果在排序过程中,容器的元素被移动了位置,迭代器可能会失效。 deque 的实现原理 分段连续内存、中控器 deque 是由一段一段的连续空间构成。
领取专属 10元无门槛券
手把手带您无忧上云