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

✍个人博客: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,具体实现原理如下:

vector 头文件

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

deque 头文件

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

list 头文件

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

2. 关联式容器

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

set/multiset 头文件

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

map/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),通过键进行操作。

STL是指标准模板库(Standard Template Library),它是C++语言的一部分,提供了一系列的模板类和函数,用于支持通用的数据结构和算法。STL的目标是提供高效、可重用和可扩展的组件,以便开发人员能够更轻松地编写高质量的代码。STL包含了许多常见的数据结构,如vector、list、set、map等,以及各种算法,比如排序、查找、遍历等。通过使用STL开发人员可以更加高效地处理各种数据结构和算法的问,提高代码的开发效率和质量。 在STL中,我们可以使用各种容器来存储和管理数据。例如,我们可以使用std::map来创建一个键值对的映射,其中每个键都有一个与之相关联的值。下面是一个示例代码,展示了如何创建和使用一个std::map对象: std::map<std::string, int> disMap() { std::map<std::string, int> tempMap{ {"C语言教程",10},{"STL教程",20} }; return tempMap; } std::map<std::string, int> newMap(disMap()); 在这个示例中,disMap()函数创建了一个临时的std::map对象,并初始化了其中的一些键值对。然后,使用移动构造函数将这个临时对象移动到了一个新的std::map对象newMap中。最终,我们可以通过newMap对象来访问和操作这些键值对。 综上所述,STLC++中的标准模板库,提供了一系列的模板类和函数,用于支持通用的数据结构和算法。STL的使用可以提高代码的开发效率和质量,并且通过各种容器和算法,可以方便地处理各种数据结构和算法的问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++ STL详解超全总结(快速入门STL)](https://blog.csdn.net/qq_50285142/article/details/114026148)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【C++实验】阅读STL源码并分析](https://blog.csdn.net/qq_35760825/article/details/125311509)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值