CSDN上下载剑指offer源码。
刷剑指offer上的题。
今日头条的服务器就用的nginx。
容器、迭代器、空间配置器
c++的STL库:容器、迭代器、泛型算法
迭代器:正向迭代器、反向迭代器、插入型迭代器。
给类模板提供相应的函数模板,依赖编译器的类型推演。
输入输出缓冲区,也可以当做容器区迭代它。
泛型算法:
二元函数通过绑定器,变成一元函数。
泛型算法,迭代器。
容器:顺序容器: vector-->向量容器:是一个内存可自动增长的数组,二倍增长。(内存二倍增长的数组)
默认构造没开辟空间。内存以1、2/4/8/16,reserve[100]、底层内存绝对连续
push_back o(1)
insert(it,val); o(n)
erase(); o(1);
pop_back(); o(1);
swap(); 效率。
给所有容器提供空间配置器。没有提供的话默认使用STL库默认的空间配置器。
deque-->双端队列容器:动态开辟的二维数组。底层内存不连续。
先二倍增长一维,(内存的增长方式)
push_back o(1)
insert(it,val); o(n)
erase(); o(1);
pop_back(); o(1);
swap(); 效率。
push_front(); o(1);//头插
pop_front(); o(1);效率高。//头删
初始的内存操作效率。
默认构造不开辟空间。
list-->双端链表容器:双向链表。
默认开辟一个头。
push_back o(1)
insert(it,val); o(n)
erase(); o(1);
pop_back(); o(1);
swap(); 效率。
push_front(); o(1);//头插
pop_front(); o(1);效率高。//头删
vector和list的区别:查询多,可以使用vector容器。插入多用list。list不能用地址的直接相减。
剑指offer的源码都是以C语言写的。
容器的底层就是一个数据结构。
容器适配器:
stack
头文件:stack
container:空间配置器。
用container定义一个栈。
底层没有对应的数据结构,只是把相应的容器方法调用了一遍。看起来是一个新的东西,其实不然。
设计模式:适配器模式。
class 适配器类=》我有两个插口,刚好供你充电(适配的关系)
{
//用vector作为一个它要去适配的一个对象。c++STL库提供了一个栈的适配器。
}
用适配器去进行一个适配。就可以了。
栈的操作:push、pop、top(返回头元素)、empty、size
queue
priority_queue:优先级队列
deque内存不是连续的,vector底层内存是连续的,扩容的时候,会先申请一个更大的内存,然后将元数据拷贝过去,再删除原数据。效率太低。
栈适合使用deque。
堆排序:在数组上建立了一个堆。
优先级队列底层为什么要用一个vector?
在数组上建立一个堆是最方便的。左右孩子可以直接通过下标计算。
数组直接给一个下标随机访问的时间复杂度都是0(1)。会非常的快。默认是一个大根堆。(最顶层是一个最大值)
堆是一颗完全二叉树。o(log2n)
外排序:要排序的数据在磁盘上存储。
堆排序:
应用1:查重
应用2:在1000000个整数里面,找值最小的前100个,对时间复杂度有要求
大根堆或小根堆解决。
找最小的前十个用小根堆,找大的用大根堆。
三个容器适配器(stack、queue、priority_queue:优先级队列),正确理解什么是适配器?
借助了堆的高效增加删除功能。
容器都是统一的。
上浮下沉都是堆自动完成的,priority_queue:优先级队列它本身就维护的是一个大根堆。