C++面试八股文:用过STL吗?
某日二师兄参加XXX科技公司的C++工程师开发岗位第21面:
面试官:用过STL吗?
二师兄:(每天都用好吗。。)用过一些。
面试官:你知道STL是什么?
二师兄:STL是指标准模板库(
Standard Template Library),是C++区别于C语言的特征之一。面试官:那你知道STL的六大部件是什么?
二师兄:分别是容器(
container)、迭代器(iterator)、适配器(adaptor)、分配器(allocator)、仿函数(functor)和算法(algorithm)。面试官:那你知道有哪些容器吗?
二师兄:STL中容器的数量比较多,按照类型可以分为顺序容器和关联容器。
二师兄:顺序容器主要有
vector、deque、list、forward_list和array。其中forward_list和array是C++11引入的。二师兄:关联容器主要有
set、map、multiset、multimap、unordered_set、unordered_map、unordered_multiset、unordered_multiamp。其中后四种是C++11新引入的。面试官:好的。那你知道迭代器分为哪些种类吗?
二师兄:分别是输入迭代器(
Input Iterator)、输出迭代器(Output Iterator)、前向迭代器(Forward Iterator)、双向迭代器(Bidirectional Iterator)和随机访问迭代器(Random Access Iterator)。二师兄:其中输入和输出迭代器分别用于读取和写入数据,前向迭代器只能向前访问而不能向后访问(
forward_list),双向迭代器既可向前也可向后(list),随机访问迭代器可以通过下标访问任何合法的位置(vector)。面试官:你知道适配器是做什么的吗?
二师兄:适配器是一种设计模式。主要起到将不同的接口统一起来的作用。STL中的容器适配器如
stack和queue,通过调用容器的接口,实现适配器所需的功能。面试官:有了解过分配器吗?
二师兄:分配器主要用于内存的分配与释放。一般容器都会自带默认分配器,很少会自己实现分配器。
面试官:有使用分配器做一些内存分配的工作吗?
二师兄:没有。。。
面试官:知道仿函数是做什么用的吗?
二师兄:是一个可执行的对象,类型重载了
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::find、std::find_if、std::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的模板类,它重载了allocate和deallocate运算符用于分配内存和释放内存。示例中malloc和free函数来分配和释放内存,也可以用new和delete。
我们可以在allocate和deallocate中做很多事情,比如我们可以统计申请和释放内存的总量,可以申请一块大内存做内存池等等。
知道STL六大部件之间的联系吗?
这个问题比较开放,需要对STL六大部件有一定的理解。首先是分配器,主要是为容器分配管理内存的。其次是迭代器,是容器和算法的桥梁。再次是仿函数,一般用作算法中,适配器提供各种粘合剂的功能,把不同部件之间的接口连接起来。
今天二师兄的面试就这些内容了,感谢小伙伴的耐心。二师兄的C++面试之旅,明天继续。
关注我,带你21天“精通”C++!(狗头)
C++面试八股文:用过STL吗?的更多相关文章
- 《面试八股文》之kafka21卷
微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是moon,最新一篇面试八股文系 ...
- 《面试八股文》之 Redis 16卷
微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. redis 作为 ...
- 《面试八股文》之 JVM 20卷
微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. <面试八股 ...
- 这可能是最全面的TCP面试八股文了
计算机网络基础,考验一个程序员的基本功,也能更快的筛选出更优秀的人才. 说说TCP的三次握手 假设发送端为客户端,接收端为服务端.开始时客户端和服务端的状态都是CLOSED. 第一次握手:客户端向服务 ...
- 一天吃透MySQL面试八股文
什么是MySQL MySQL是一个关系型数据库,它采用表的形式来存储数据.你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列).行代表每一行数据,列代表该行中的每个值.列上的值是 ...
- 一天吃透JVM面试八股文
什么是JVM? JVM,全称Java Virtual Machine(Java虚拟机),是通过在实际的计算机上仿真模拟各种计算机功能来实现的.由一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一 ...
- 这可能是最全面的MySQL面试八股文了
什么是MySQL MySQL是一个关系型数据库,它采用表的形式来存储数据.你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列).行代表每一行数据,列代表该行中的每个值.列上的值是 ...
- 这可能是最全面的Redis面试八股文了
Redis连环40问,绝对够全! Redis是什么? Redis(Remote Dictionary Server)是一个使用 C 语言编写的,高性能非关系型的键值对数据库.与传统数据库不同的是,Re ...
- 三天吃透Spring面试八股文(最新整理)
本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...
- 三天吃透Java虚拟机面试八股文
本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...
随机推荐
- [Java SE]Java方法的参数传递机制:值传递
1 案例引入:实验源码 [案例结论] 若调用方client想通过修改方法updateMethod(oldObject)对调用方所在的引用对象(非基本数据类型)oldObject的属性值进行修改,则: ...
- 深入理解 python 虚拟机:字节码教程(2)——控制流是如何实现的?
深入理解 python 虚拟机:字节码教程(2)--控制流是如何实现的? 在本篇文章当中主要给大家分析 python 当中与控制流有关的字节码,通过对这部分字节码的了解,我们可以更加深入了解 pyth ...
- systemctl 命令设置开机自启动失败
哈喽大家好,我是咸鱼.今天跟大家分享一个关于 Linux 服务(service)相关的案例 案例现象 我在 3 月 31日的时候发表了一篇<shell 脚本之一键部署安装 Nginx> ...
- ubuntu搭建深度学习环境
安装vscode 方法一: 依次输入如下命令 1.sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make 2.sudo apt-get updat ...
- Linux 阶段二
1.2 安装JDK JDK具体安装步骤如下: 1). 上传安装包 使用FinalShell自带的上传工具将jdk的二进制发布包上传到Linux 由于上述在进行文件上传时,选择的上传目录为根目录 /,上 ...
- 归并排序c++(逆序对)
归并排序c++(逆序对) 目录 题目链接 思路 算法 分离数组 合并 代码 目录 归并排序(Merge Sort)是建立在归并操作上的一种既有效又稳定的排序算法,该算法是采用分治法(Divide an ...
- 如何通过C#/VB.NET 代码调整PDF文档的页边距
PDF边距是页面主要内容区域和页面边缘之间的距离.与Word页边距不同,PDF文档的页边距很难更改.因为Adobe没有提供操作页边距的直接方法.但是,您可以通过缩放页面内容来改变页边距.本文将介绍如何 ...
- ai问答:使用 Vue3 组合式API 和 TS 封装 websocket 断线重连
这是一个使用 Vue3 组合式 API 和 TS 封装 websocket 的例子 这个组件在 setup 中: 创建了一个 WebSocket 连接 定义了 sendMessage 方法发送消息 监 ...
- 用vue+elementui写了一个图书管理系统
用vue+elementui写了一个图书管理系统 转载自公号:java大师 目前是指一个纯前端的展示,后端还在开发中,前端接口是通过json-server模拟的 用到的技术栈 1.vue.js 2.e ...
- 2022-07-21:给定一个字符串str,和一个正数k, 你可以随意的划分str成多个子串, 目的是找到在某一种划分方案中,有尽可能多的回文子串,长度>=k,并且没有重合。 返回有几个回文子串。 来
2022-07-21:给定一个字符串str,和一个正数k, 你可以随意的划分str成多个子串, 目的是找到在某一种划分方案中,有尽可能多的回文子串,长度>=k,并且没有重合. 返回有几个回文子串 ...