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