当前位置: 首页> 科技> 数码 > 【C++ 面试 - STL】每日 3 题(一)

【C++ 面试 - STL】每日 3 题(一)

时间:2025/7/9 17:16:04来源:https://blog.csdn.net/Newin2020/article/details/141747009 浏览次数:2次

✍个人博客:Pandaconda-CSDN博客

📣专栏地址:http://t.csdnimg.cn/fYaBd

📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

 1. 请说说 STL 的基本组成部分

标准模板库(Standard Template Library,简称 STL)简单说,就是一些常用数据结构和算法的模板的集合。

广义上讲,STL 分为 3 类:Algorithm(算法)、Container(容器)和 Iterator(迭代器),容器和算法通过迭代器可以进行无缝地连接。

详细的说,STL 由 6 部分组成:容器(Container)、算法(Algorithm)、迭代器(Iterator)、仿函数(Function object)、适配器(Adaptor)、空间配制器(Allocator)。

  

标准模板库 STL 主要由 6 大组成部分:

  1. 容器(Container)

      是一种数据结构, 如 list、vector 和 deques,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器。

  2. 算法(Algorithm)

      是用来操作容器中的数据的模板函数。例如,STL 用 sort() 来对一个 vector 中的数据进行排序,用 find() 来搜索一个 list 中的对象, 函数本身与他们操作的数据的结构和类型无关,因此他们可以用于从简单数组到高度复杂容器的任何数据结构上。

  3. 迭代器(Iterator)

      提供了访问容器中对象的方法。例如,可以使用一对迭代器指定 list 或 vector 中的一定范围的对象。 迭代器就如同一个指针。事实上,C++ 的指针也是一种迭代器。 但是,迭代器也可以是那些定义了 operator*() 以及其他类似于指针的操作符方法的类对象。

  4. 仿函数(Function object)

      仿函数又称之为函数对象, 其实就是重载了操作符的 struct,没有什么特别的地方。

  5. 适配器(Adaptor)

      简单的说就是一种接口类,专门用来修改现有类的接口,提供一中新的接口;或调用现有的函数来实现所需要的功能。主要包括 3 中适配器 Container Adaptor、Iterator Adaptor、Function Adaptor。

  6. 空间配制器(Allocator)

      为 STL 提供空间配置的系统。其中主要工作包括两部分:

    1. 对象的创建与销毁

    2. 内存的获取与释放

2. 请说 说 STL 中常见的容器,并介绍一下实现原理

参考回答

容器可以用于存放各种类型的数据(基本类型的变量,对象等)的数据结构,都是模板类,分为顺序容器、关联式容器、容器适配器三种类型,三种类型容器特性分别如下:

1. 顺 序容器

容器并非排序的,元素的插入位置同元素的值无关。包含 vector、deque、list,具体实现原理如下:

vect or 头文件

  动态数组。元素在内存连续存放。随机存取任何元素都能在常数时间完成。在尾端增删元素具有较佳的性能。

dequ e 头文件

  双向队列。元素在内存连续存放。随机存取任何元素都能在常数时间完成(仅次于 vector)。在两端增删元素具有较佳的性能(大部分情况下是常数时间)。

list  头文件

  双向链表。元素在内存不连续存放。在任何位置增删元素都能在常数时间完成。不支持随机存取。

2. 关联 式容器

元素是排序的;插入任何元素,都按相应的排序规则来确定其位置;在查找时具有非常好的性能;通常以平衡二叉树的方式实现。包含 set、multiset、map、multimap,具体实现原理如下:

set/ multiset 头文件

  set 即集合。set 中不允许相同元素,multiset 中允许存在相同元素。

m ap/multimap 头文件

  map 与 set 的不同在于 map 中存放的元素有且仅有两个成员变,一个名为 first,另一个名为 second, map 根据 first 值对元素从小到大排序,并可快速地根据 first 来检索元素。

  注意:map 同 multimap 的不同在于是否允许相同 first 值的元素。

3. 容 器适配器

封装了一些基本的容器,使之具备了新的函数功能,比如把 deque 封装一下变为一个具有 stack 功能的数据结构。这新得到的数据结构就叫适配器。包含 stack、queue 和 priority_queue,具体实现原理如下:

sta ck 头文件

  栈是项的有限序列,并满足序列中被删除、检索和修改的项只能是最进插入序列的项(栈顶的项)。后进先出。

q ueue 头文件

  队列。插入只可以在尾部进行,删除、检索和修改只允许从头部进行。先进先出。

 priority_queue 头文件

  优先级队列。内部维持某种有序,然后确保优先级最高的元素总是位于头部。最高优先级元素总是第一个出列。

另外,还存在哈希表容器,如 unordered_set 和 unordered_map。

 3. vector、list、map 的插入、删除和查找的时间复杂度是多少?

  1. vector:插入和删除尾部元素的时间复杂度是 O(1),在其他位置插入和删除元素的时间复杂度是 O(n),通过索引直接访问元素的时间复杂度是 O(1)。对于无序的 vector,查找元素的时间复杂度是 O(n)。

  2. list:在任意位置插入和删除元素的时间复杂度都是 O(1),无序的list查找元素的时间复杂度是 O(n)。

  3. map:插入、删除和查找元素的时间复杂度都是 O(logn),通过键进行操作。

关键字:【C++ 面试 - STL】每日 3 题(一)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: