某日二师兄参加XXX科技公司的C++工程师开发岗位第21面:

面试官:用过STL吗?

二师兄:(每天都用好吗。。)用过一些。

面试官:你知道STL是什么?

二师兄:STL是指标准模板库(Standard Template Library),是C++区别于C语言的特征之一。

面试官:那你知道STL的六大部件是什么?

二师兄:分别是容器(container)、迭代器(iterator)、适配器(adaptor)、分配器(allocator)、仿函数(functor)和算法(algorithm)。

面试官:那你知道有哪些容器吗?

二师兄:STL中容器的数量比较多,按照类型可以分为顺序容器和关联容器。

二师兄:顺序容器主要有vectordequelistforward_listarray。其中forward_listarray是C++11引入的。

二师兄:关联容器主要有setmapmultisetmultimapunordered_setunordered_mapunordered_multisetunordered_multiamp。其中后四种是C++11新引入的。

面试官:好的。那你知道迭代器分为哪些种类吗?

二师兄:分别是输入迭代器(Input Iterator)、输出迭代器(Output Iterator)、前向迭代器(Forward Iterator)、双向迭代器(Bidirectional Iterator)和随机访问迭代器(Random Access Iterator)。

二师兄:其中输入和输出迭代器分别用于读取和写入数据,前向迭代器只能向前访问而不能向后访问(forward_list),双向迭代器既可向前也可向后(list),随机访问迭代器可以通过下标访问任何合法的位置(vector)。

面试官:你知道适配器是做什么的吗?

二师兄:适配器是一种设计模式。主要起到将不同的接口统一起来的作用。STL中的容器适配器如stackqueue,通过调用容器的接口,实现适配器所需的功能。

面试官:有了解过分配器吗?

二师兄:分配器主要用于内存的分配与释放。一般容器都会自带默认分配器,很少会自己实现分配器。

面试官:有使用分配器做一些内存分配的工作吗?

二师兄:没有。。。

面试官:知道仿函数是做什么用的吗?

二师兄:是一个可执行的对象,类型重载了operator()()运算符。

struct Add
{
int operator()(int a, int b) {return a +b;}
}
int a = 42, b = 1024;
auto sum = Add()(a,b);
//OR
Add add;
auto sum = add(1,2);

面试官:STL中常见的算法有哪些?

二师兄:一般分为三类,查找、排序和数值操作。

二师兄:查找常用的有std::findstd::find_ifstd::find_first_of等。

二师兄:排序主要用std::sort及其家族的一系列算法。

二师兄:数值操作主要用std::accumulate求和。

面试官:那你知道STL六大部件之间的联系吗?

二师兄:(想了想)不是特别清楚。。。

面试官:好的,回去等通知吧。

让我们回顾一下二师兄的表现:

有使用分配器做一些内存分配的工作吗?

这里主要是问有没有手写过分配器:

template <typename T>
class MyAllocator {
public:
typedef T value_type;
MyAllocator() noexcept {}
template <typename U>
MyAllocator(const MyAllocator<U>&) noexcept {}
T* allocate(std::size_t n) {
if (n > std::size_t(-1) / sizeof(T)) throw std::bad_alloc();
if (auto p = static_cast<T*>(std::malloc(n * sizeof(T)))) return p;
throw std::bad_alloc();
}
void deallocate(T* p, std::size_t) noexcept {
std::free(p);
}
};

实例中定义了一个名为MyAllocator的模板类,它重载了allocatedeallocate运算符用于分配内存和释放内存。示例中mallocfree函数来分配和释放内存,也可以用newdelete

我们可以在allocatedeallocate中做很多事情,比如我们可以统计申请和释放内存的总量,可以申请一块大内存做内存池等等。

知道STL六大部件之间的联系吗?

这个问题比较开放,需要对STL六大部件有一定的理解。首先是分配器,主要是为容器分配管理内存的。其次是迭代器,是容器和算法的桥梁。再次是仿函数,一般用作算法中,适配器提供各种粘合剂的功能,把不同部件之间的接口连接起来。

今天二师兄的面试就这些内容了,感谢小伙伴的耐心。二师兄的C++面试之旅,明天继续。

关注我,带你21天“精通”C++!(狗头)

C++面试八股文:用过STL吗?的更多相关文章

  1. 《面试八股文》之kafka21卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是moon,最新一篇面试八股文系 ...

  2. 《面试八股文》之 Redis 16卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. redis 作为 ...

  3. 《面试八股文》之 JVM 20卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. <面试八股 ...

  4. 这可能是最全面的TCP面试八股文了

    计算机网络基础,考验一个程序员的基本功,也能更快的筛选出更优秀的人才. 说说TCP的三次握手 假设发送端为客户端,接收端为服务端.开始时客户端和服务端的状态都是CLOSED. 第一次握手:客户端向服务 ...

  5. 一天吃透MySQL面试八股文

    什么是MySQL MySQL是一个关系型数据库,它采用表的形式来存储数据.你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列).行代表每一行数据,列代表该行中的每个值.列上的值是 ...

  6. 一天吃透JVM面试八股文

    什么是JVM? JVM,全称Java Virtual Machine(Java虚拟机),是通过在实际的计算机上仿真模拟各种计算机功能来实现的.由一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一 ...

  7. 这可能是最全面的MySQL面试八股文了

    什么是MySQL MySQL是一个关系型数据库,它采用表的形式来存储数据.你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列).行代表每一行数据,列代表该行中的每个值.列上的值是 ...

  8. 这可能是最全面的Redis面试八股文了

    Redis连环40问,绝对够全! Redis是什么? Redis(Remote Dictionary Server)是一个使用 C 语言编写的,高性能非关系型的键值对数据库.与传统数据库不同的是,Re ...

  9. 三天吃透Spring面试八股文(最新整理)

    本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...

  10. 三天吃透Java虚拟机面试八股文

    本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...

随机推荐

  1. python内在模块之winreg --- Windows 注册表访问

    winreg --- Windows 注册表访问¶ 这些函数将 Windows 注册表 API 暴露给 Python.为了确保即便程序员忽略了显式关闭句柄,该句柄依然能够正确关闭,它使用了一个 han ...

  2. [Oracle]创建数据库表【待完善】

    1 前期准备 -- 参考文献 https://www.it1352.com/597381.html -- step1 创建用户<JOHNY>, 来创建对应的(默认)数据库模式(SCHEMA ...

  3. linux防火墙开放1521端口

    问题描述:使用plsql连接数据库发现TNS报错,登录服务器发现防火墙开放,如果直接关闭防火墙,所有的端口都可以连接,但是实际中可能会遇到开启防火墙的库,这时候需要开放单一端口对某一服务器或者某一网段 ...

  4. c/c++零基础坐牢第二天

    c/c++从入门到入土(2) 开始时间2023-04-13 23:02:34 结束时间2023-04-14 01:26:05 前言:如果第一天没把你劝退,恭喜你!通过今天的学习你就能半步踏进编程的大门 ...

  5. 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(14)-Charles过滤网络请求

    1.简介 在日常工作测试中,经常要抓包看请求的request,response是不是传的对,返回的字段值对不对,众多的请求中看得眼花缭乱,如何找到自己想要的请求,那么我们就需要过滤请求.Charles ...

  6. 在 plist 中轻松转换两种格式

      在 plist 中,有两种常见的格式:.plist 和 .plistx.这两种格式有什么区别?它们之间如何相互转换?本文将为您详细解答. 在 iOS 上架时,需要将 plist 文件上传到苹果的 ...

  7. SqlServer查看表结构

    SELECT CASE WHEN col.colorder = 1 THEN obj.name ELSE '' END AS 表名 ,CASE WHEN col.colorder=1 then isn ...

  8. UniApp小程序开发项目创建与运行

    1.准备工作:HbuiderX  +  微信开发者工具下载安装+小程序账号申请开通(这里就不例举了,可以看同账号uniapp小程序开发准备) 2.创建项目 新版本的HbuilderX点击新建项目--选 ...

  9. vCenter报错:Log Disk Exhaustion on 10

    vCenter报错:Log Disk Exhaustion on 10 1.问题现象: 巡检时发现 vCenter Server 中,错误显示为:Log Disk Exhaustion on 10(字 ...

  10. 【Python基础】 什么是函数

    函数是一段可重用的代码块,它接受输入参数并返回输出.函数在程序设计中具有很多优点,如: 代码重用:在程序中可以重复调用相同的代码块,使程序更加简洁.高效. 模块化设计:函数是模块化设计的基本单元,可以 ...