前言
本文介绍了C++ STL,基于施磊老师的C++课程。
一、vector容器
需要注意的有两点:
1、迭代器失效问题
2、reserve和resize的区别,size和capacity的区别:
二、deque容器和list容器
deque容器,即双端队列容器。其底层数据结构是一个动态开辟的二维数组,一维数组从2开始,以2倍的方式进行扩容,每次扩容后,原来的第二维数组,从新的第一维数组的下标oldsize / 2开始存放,上下都预留相同的空行,方便支持deque的首尾元素添加。
list容器,即链表容器。其底层数据结构是一个双向链表。
三、vector、deque、list对比
注意vector和deque的区别,在中间进行insert或者erase时,deque更加麻烦
四、容器适配器
适配器底层没有自己的数据机构,他是另外一个容器的封装,他的方法全部由底层依赖的容器实现。如STL中stack容器的实现,底层依赖于deque容器。
Q1:为什么stack和queue的底层不用vector实现呢?
1、vector的初始内存使用效率太低了
2、对于queue来说,需要支持尾部插入、头部删除;使用vector效率很低
3、deque的内存利用率更高
Q2:为什么priority_que的底层为什么用vector不用deque?
大根堆的使用需要计算元素之间的下标关系,使用deque不能快速计算某个节点的左右孩子节点
五、函数对象
C++的函数对象对应C语言的函数指针,我们将有operator()小括号运算符重载函数的对象,称作函数对象或者仿函数。
通过函数指针调用函数,没有办法进行内联,效率很低,因为有函数调用开销。
而通过函数对象调用,可以根据对象确定调用具体的函数从而能在编译阶段确定是否内联。
函数对象的优势: