首页 > 编程语言 >C++面试八股文:用过STL吗?

C++面试八股文:用过STL吗?

时间:2023-06-21 23:56:32浏览次数:41  
标签:std 面试官 八股文 迭代 STL C++ 分配器 师兄

某日二师兄参加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++!(狗头)

标签:std,面试官,八股文,迭代,STL,C++,分配器,师兄
From: https://www.cnblogs.com/binarch/p/17497323.html

相关文章

  • C++面试八股文:了解auto关键字吗?
    C++面试八股文:了解auto关键字吗?某日二师兄参加XXX科技公司的C++工程师开发岗位第15面:面试官:了解auto关键字吗?二师兄:嗯,了解一些(我很熟悉)。面试官:说一说auto的用法吧?二师兄:auto主要是为了编译器进行类型推导。比如:autoi=42; //i被推导位int型std::vector<int>vi......
  • 现代C++学习指南-具体类
    类作为C++中重要的概念之一,有着众多的特性,也是最迷人的部分!类是一个加工厂,开发者使用C++提供的各种材料组装这个工厂,使得它可以生产出符合自己要求的数据,通过对工厂的改造,可以精细控制对象从出生到死亡的各种行为,真正达到我的代码我做主的境界。类我们经常说的面向对象三大特......
  • stringstream 与auto c++
    stringstream的用法,动态创建不同文件名for(inti=0;i<n;i++) { stringfilename; stringstreamss; ss<<"file"<<i<<".txt"; ss>>filename; ss.clear(); }auto的用法,通常用于for循环常规思路,我们想要输出一个数组的全部元素时,往往采用以下......
  • C++中的类简要介绍
    (文章目录)前言本篇文章讲给大家介绍一个C++中重要的概念,了解了这个概念大家就明白了为什么C++会叫做面向对象编程了。一、什么是类什么是对象1.类的概述其实我们生活中有很多类的例子,就像老虎是猫科动物可以看作一个大类,昆虫又是一个大类,机动车和非机动车又是不同的类。通过......
  • 程序删除自身 c++ win32
    include<windows.h>//设置本程序进程基本为实时执行,快速退出。SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS);SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL);//通知资源管理器,本程序删除SHChangeNotify(SHCNE_DELETE,SHCNF_PA......
  • 认识soui4js(第三篇):使用C/C++开发扩展模块
    首先需要明确:JS代码本身不具备直接调用系统API的能力,JS代码能调用什么功能,都依赖于其它扩展模块提供了什么样的接口。soui4js模块将soui的界面能力作为一个js模块导出到了js中,使得js可以和C++一样操作GUI。但是操作GUI只是一个客户端APP的一个需求。一个产品可能会有各种需求是......
  • C++ 中的运算符重载
     您可以重定义或重载大部分C++内置的运算符。这样,您就能使用自定义类型的运算符。重载的运算符是带有特殊名称的函数,函数名是由关键字operator和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。https://www.lekaowang.com/jszgz/z......
  • C++ 中的函数重载
     在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。您不能仅通过返回类型的不同来重载函数。https://www.lekaowang.com/jszgz/zxj/lfb/......
  • C++ 多态
     多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。https://www.lekaowang.com/zhxfgcs/kfx/0j0/......
  • 常用STL时间复杂度
    缘由最近有好几次写题因为STL的时间复杂度弄错导致题目T了,还找不到原因后(自己以为时间复杂度没有问题),被学长狠狠嘲讽了:( 所以写下这篇blog来总结常用的STL复杂度(我不想原地退役),希望以后不会错了。vectorpush_back:O(1)pop_back:O(1)insert:O(n)erase:O(n)......