C++基础知识(9)

57、deque容器的底层原理

(1)deque的存储结构

deque容器存储数据的空间是由一段一段等长的连续空间构成的,各段空间之间不一定是连续的,可以位于内存的不同区域。为了管理这些连续的内存空间,deque容器用一个数组(map)来存放各段连续空间的首地址,也就是说map存放的是指针,以此来访问各段连续空间中存储的元素。当map数组满了,就会申请一块更大的内存来供map使用,原本的数据(指针)拷贝到新的数组中,释放旧的内存空间。

(2)deque的迭代器

deque是一个双端队列,头尾都可以插入元素,这得益于其存储结构和迭代器。deque有两个迭代器start和finish,每个迭代器有四个指针:

#1 cur_ptr:指向当前正在遍历的元素

#2 first_ptr:指向当前连续空间的首地址

#3 last_ptr:指向当前连续空间的末尾地址

#4 node_ptr:是一个二级指针,用于指向map数组中存储的指向当前连续空间的指针

58、list底层实现原理

list底层是一个双向链表,以结点为单位存放数据,结点的地址在内存中不一定连续,每次插入或者删除一个元素,就配置或者释放一个元素的空间。list不支持随机存取,适合需要大量的插入和删除,而不关心随即存取的应用场景。与之对应的还有以单链表为底层的forward_list(C++11新增)。

59、什么情况下使用vector,什么情况下使用deque,什么情况下使用list?

(1)vector可以随机存储元素,但是非尾部插入或者删除元素效率低,适合对象数量变化不大,随机访问频繁的情况。

(2)deque的底层结构比vector复杂,占用内存高,所以只有需要首尾插入或删除,并且兼顾随机访问的时候才用deque,否则用vector

(3)list适合需要大量的插入和删除数据,不在乎存取时间的情况。

60、map、set、multiset、multimap的底层实现原理

(1)map、set、multiset、multimap的底层是由红黑树来实现的,epoll模型的底层数据结构也红黑树

(2)红黑树的特性

#1 每个结点要么是红色要么是黑色

#2 根结点一定为黑色

#3 叶子结点也是黑色

#4 如果一个结点为红色,则他的两个儿子均为黑色

#5 每个结点到其子孙结点的所有路径上包含相同的黑色结点

(3)map、set、multiset、multimap的特点

set和multiset会根据特定的排序准则自动将元素排序,set中元素不能重复,而multiset可以重复

map和multimap将key和value组成的pair作为元素,根据key的排序准则自动将元素排序,map中的key不允许重复,但multimap可以重复

map和set的增删改查速度都为log(n)

(4)map、unordered_map的几种插入方式

#include<map>
#include<unordered_map>

std::map<int,string>tempmap;
tempmap.insert(pair<int,string>(1,"Mike"));
tempmap.insert(map<int,string>::value_type(2,"May"));
tempmap.insert(make_pair(3,"Jane"));
tempmap[4] = "LiHua";

std::unordered_map<int,string>hashmap;
hashmap.insert(pair<int,string>(1,"Mike"));
hashmap.insert(map<int,string>::value_type(2,"May"));
hashmap.insert(make_pair(3,"Jane"));
hashmap[4] = "LiHua";

61、unordered_map、unordered_set底层实现原理

(1)unordered_map和unordered_set的底层是一个防冗余的哈希表,哈希表最大的优点就是把数据的存储和查询消耗的时间大大降低,时间复杂度为O(1);而代价是消耗比较多的内存。

(2)实现原理:

使用一个下标范围比较大的数组来存储元素。可以设计一个哈希函数,也叫散列函数,使得每个元素的key都与一个函数值相对应,用这个数组来存储这个元素。但是不能保证每个元素的key都与函数值一一对应,因此极有可能出现对于不同的元素,却计算出相同的函数值,这就产生了哈希冲突,这一般可以用开链法解决。

用vector来存放各链表的头指针,每个键值对存放在通过哈希计算得到对应的链表上,当产生哈希冲突时,链表继续添加元素。但是链表长度不宜过程,否则效率很低,所以这就要求哈希函数尽量设计的分散一些。

62、unordered_map和map的区别以及使用场景

(1)构造函数不一样:unordered_map需要hash函数,而map需要比较函数(默认小于函数)

(2)存储结构不一样:unordered_map采用hash表存储,map采用红黑树实现

(3)查找速度:一般情况下unordered_map比map快,而且查找的速度与数据量大小无关,属于常数级别;而map查找速度为log(n)。但是并不一定常数就比log(n)小,因为hash还有hash函数的耗时

(4)使用场景:如果考虑效率,特别是数量达到一定级别,那么使用unordered_map;但若是对内存使用特别严格,希望程序尽可能消耗较小的内存,那么使用map

63、STL的空间配置器allocate

STL的内存管理是使用两级内存配置器

(1)第一级配置器

第一级配置器是对malloc函数和free函数的简单封装,在allocate内掉哟个malloc,在deallocate内调用free,使用与分配大于128字节的空间

(2)第二级配置器

第一级配置器直接调用malloc和free带来了几个问题:

#1 内存分配/释放的效率低

#2 当配置大量的小内存块时,会导致内存碎片比较严重

#3 配置内存时,需要额外的部分空间存储内存块的信息,所以配置大量的小内存块时,还会导致额外的内存负担

第二级配置器是用内存池来管理的,适用于分配内存块小于128字节,内部维护了一个自由链表数组,每次需要分配内存的时候,直接从相应的链表上取出一个内存节点就完成工作,效率大大提高。

详细可以查看:https://zhuanlan.zhihu.com/p/34725232

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在C编程语言的基础知识面试中,通常会涉及以下几个方面的问题: 1. C语言的特点与用途:C语言是一种通用的高级程序设计语言,可以用来开发底层操作系统、嵌入式系统、游戏开发等应用。它具有简洁、效率高、可移植性强等特点。 2. C语言的数据类型与变量:C语言支持不同的数据类型,包括整型、浮点型、字符型等。使用变量来存储数据,变量需要先声明后使用,并且可以进行各种运算。 3. C语言的控制流程:C语言中的控制流程有条件判断语句、循环语句和跳转语句。条件判断语句通过判断条件的真假来决定执行哪个分支;循环语句可以重复执行一段代码,直到满足退出条件;跳转语句可以改变代码的执行顺序。 4. C语言的函数与库:C语言支持函数的定义和调用,可以将一段代码封装成函数,提高代码的复用性。此外,C语言还提供了一些标准库,包括输入输出库、数学库等,可以在程序中使用这些库函数来完成各种操作。 5. C语言的指针和内存管理:C语言具有灵活的指针操作功能,可以通过指针来直接访问内存中的数据。指针可以用于动态内存分配和释放,通过调用malloc()和free()函数来进行操作。 除了以上几个方面的基础知识,面试中可能还会涉及到关于C语言的编程题,例如要求解决某个具体的问题或者实现某个算法等。在面试中,不仅要掌握C语言的基础知识,还需要具备解决问题的思路和能力,能够独立分析和编写C程序。 ### 回答2: C基础知识面试主要涉及面向过程的编程语言C的基础概念、语法和应用。在面试中,通常会涉及以下几个方面的问题: 1. C语言的基本概念和特性:要求候选人能够解释C语言的起源、用途和特点,了解C语言的运行环境和编译过程。 2. C语言的数据类型:面试官可能会问到C语言中的基本数据类型,如int、char、float等,以及它们在内存中的存储方式和占用空间大小。 3. C语言的控制结构:掌握C语言中的分支语句(if-else、switch-case)和循环语句(for、while、do-while),并能够解答相关的应用题。 4. C语言的函数:了解函数的定义、声明和调用规则,理解函数的参数传递和返回值机制,能够编写简单的函数。 5. C语言的指针:熟悉指针的基本概念和用法,了解指针和数组、指针和函数之间的关系,能够解决指针相关的问题。 6. C语言的内存管理:了解动态内存分配(malloc、free)和静态内存分配(全局变量、局部变量)的区别和用法,了解内存泄漏和内存溢出的概念。 7. C语言的文件操作:熟悉文件的打开、读写、关闭等基本操作,能够读写文本文件和二进制文件,了解文件指针的概念和用法。 8. C语言的预处理器:了解预处理器的作用和常用指令(如#define、#include等),理解宏定义的概念和用法。 在C基础知识面试中,除了回答问题,面试官可能还会要求候选人编写简单的C代码,以检测其编程能力和解决问题的能力。所以,在准备面试时,应该复习C语言的基础概念、语法和应用,并进行代码练习,提高自己的实践能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

czy1219

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

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

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

打赏作者

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

抵扣说明:

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

余额充值