C++STL面经

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 则直接在容器的末尾构造对象,省去了拷贝的过程。

你可能感兴趣的:(c++,数据结构)