c++第20次课__2018.06.01

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:优先级队列它本身就维护的是一个大根堆。

猜你喜欢

转载自blog.csdn.net/weixin_40316053/article/details/80541794