C++STL面经

您所在的位置:网站首页 动态库实现原理 C++STL面经

C++STL面经

2023-03-23 23:15| 来源: 网络整理| 查看: 265

C++STL面经 1. STL 的基本组成部分。2. STL 常见的容器,实现原理,对应的事件复杂度。3. 介绍下 STL 中的空间适配器。4. STL 是怎么删除元素的?迭起器什么时候会失效?5. 迭代器的作用是什么?和指针的区别?6. STL 中的 resize 和 reserver 有什么区别?7. STL 容器动态链接可能产生的问题?8. map 和 unordered_map 的区别?9. push_back 和 emplace_back 的区别?

1. STL 的基本组成部分。 STL 为标准模板库,为一些常见数据结构和算法的模板集合。标准模板库 STL 主要有 6 部分组成:(1)Container(容器):是一种数据结构,如 list,vector 和 deques。为了访问容器中的数据,可以使用容器输出的迭代器。(2)Algorithm(算法):是用来操作容器中数据的模板函数,如使用 sort 对 vector 容器中的数据进行排序。(3)Iterator(迭代器):提供了访问容器中数据的方法,如使用迭代器获取 vector 中某范围内的数据。(4)Function object(仿函数):仿函数又称函数对象,为重载了操作符的 struct。(5)Adaptor(适配器):是一种接口类,专门用来修改现有类的结构,提供一个新的接口。(6)Allocator(空间适配器):为 STL 提供空间配置,如对象的创建与销毁,内存的销毁与创建。 2. STL 常见的容器,实现原理,对应的事件复杂度。 顺序容器:元素是非排序的,插入位置与元素值无关。(1)vector:动态数组,元素在内存中连续存放,随机存取任何元素都能在常数时间完成,在尾端增删元素具有较佳的性能。插入O(N),查看O(1),删除O(N)。(2)deque:双向队列,元素在内存中连续存放,随机存取任何元素都能在常数时间完成,在两端增删元素具有较佳的性能。插入O(N),查看O(1),删除O(N)。(3)list:双向链表,元素在内存中不连续存放,不支持随机存取,在任何位置增删元素都能在常数时间完成。插入O(1),查看O(N),删除O(1)。关联容器:底层是通过红黑树实现的,具有自动排序的功能。(1)set/multiset:集合,set 中不允许相同的元素,multiset 允许相同的元素。插入O(logN),查看O(logN),删除O(logN)。(2)map/multimap:字典,map 中存放元素中仅有两个变量 first 和 second,map 根据 first 的值进行从小到大的排序。插入O(logN),查看O(logN),删除O(logN)。适配器容器:封装了些基本的容器,使之具有新的功能。(1)stack:栈,删除,查看,修改的项只能是最新插入的项。(2)queue:队列,插入只可以在队尾进行,删除,查看和修改只允许从头部进行。(3)priority_queue:优先队列,内部有序,确保优先级最高的元素位于头部,且是第一个出列。 3. 介绍下 STL 中的空间适配器。 一般情况下,一个程序包含数据结构和相应的算法,而数据结构作与内存空间有着模切的关联。空间适配器就是为了实现内存空间分配的工具,每一种容器的空间分配都是通过空间适配器 alloctor 实现的。 4. STL 是怎么删除元素的?迭起器什么时候会失效? (1)对于 vector,deque 来说,使用 erase 后,后面的每个元素迭代器都会失效,但 erase 会返回下一个有效的迭代器。(2)对于 map,set 来说,使用了 rease 后,只有当前元素的迭代器会失效,需要提前记录下一个元素的迭代器。(3)对于 list 来说,因为它使用了不连续的内存分配,所以既可以使用 erase 返回的迭代器,也可以记录下一个迭代器。 5. 迭代器的作用是什么?和指针的区别?

作用:

用于指向顺序容器和关联容器中的元素。通过迭代器可以读取它指向的元素。通过非 const 迭代器可以修改它指向的元素。

区别:

迭代器不是指针,是类模板,表现得像指针。它模拟了指针的一些功能,重载了指针的一些操作符,比如 ++,–。迭代器封装了指针,是一个可以遍历 STL 容器内全部或部分元素的对象。 6. STL 中的 resize 和 reserver 有什么区别?

-(1)resize 即分配了空间,也创建了对象;reserve 表示容器预留空间,并没有创建对象,需要 insert 或 push_back 来创建对象。 -(2)resize 即可以修改 capacoty 大小,也可以修改 size 大小;reserve 只能够修改 capacity 大小。

7. STL 容器动态链接可能产生的问题? 当给动态库函数传递容器的对象本身时,会出现内存堆栈被破坏的问题。是因为容器和动态链接库的相互支持不够友好。当动态链接库使用容器时,需要保证容器的大小不能超出初始大小。否则容器自动重新分配,出现堆栈破坏。 8. map 和 unordered_map 的区别?

-(1)map 是通过红黑树来实现的,红黑树有自动排序的功能,因此 map 内的所有元素都是有序的。 -(2)unordered_map 是通过哈希表来实现的,把关键码值映射到哈希表中的一个位置进行记录,查找时间复杂度为O(1),但元素的排列是无序的。

9. push_back 和 emplace_back 的区别? 如果需要将一个临时变量 push 到容器的末尾,push_back 需要先构造临时对象再进行拷贝。而 emplace_back 则直接在容器的末尾构造对象,省去了拷贝的过程。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3