优先级队列
目录
插入删除效率为logN
变成小堆(底层)
不用手写构造函数和析构函数,会调用自定义函数vector,拷贝构造也不用写
仿函数
1 重载一个operator()
2 像是调用函数 但是是一个对象(想要替代函数指针)
3 单看less(2,3)会觉得像一个函数名,或者函数指针,函数调用 但是转换成less.operator(),是一个对象,但是可以像函数一样去使用(所以叫防函数,也叫函数对象)、
4 不能换成{}运算符重载规则不能创造新的运算符(有特定的运算符)[]也不行,已经有了
仿函数套用模版
仿函数是一个类,是类就可以在模版参数传递,也能在函数参数传
之前参数是int x,int y 加了,模版后,更加灵活(int,double都可以了)
用途
怎么让优先队列从默认大堆变小堆呢?
c中qsort用函数指针控制,但是函数指针不好用
compare参数
_con[child]>_con[parent]变成_con[parent] <_con[child]
compare是less类型,com是compare对象调用operator()传递两个参数(父子)进行比较
默认情况是less(缺省参数)类比小于,重新写一个greater
大堆的q没写全因为有缺省参数
写全后
换成greater就是比较大于的就成了小堆)(greater,和less库里面有不用自己写,库里面是大写)
一旦我们有了大堆,就可以开始出栈过程。出栈操作包括三个步骤:
- 取出堆顶元素(即最大元素)。
- 将堆的最后一个元素替换为堆顶元素。
- 对新的堆顶元素执行堆化操作,以确保大堆的性质得到维护
sort排序
默认是升序(Less)
类模板需要显式实例化,函数模版会自动推演
显示实例化
函数要传参可以自己推导类型,而类必须要显示实例化
例如A<int> aa; 这里就告诉aa 要是显示实例化成int类型
所以下面Func(1)传的是对象,A<int> aa。int传的是类型
友元函数声明在类里面,定义在类外面(全局)
优先级队列默认是大堆
往里面存自定义类型date指针,这里最大值在变,因为是data*指针,new出来的data指针,先new,跟后new出来的指针大小都是随机的(new出来的地址大小是随机的)
自己写一个规则
传递到上面
此时compare就是PDatecompare,com就是Pdatecompare的对象 通过com调用Pdatecompare比较函数(有点像回调函数)
中缀转后缀
遇到“()”递归一个子栈去解决
Stack
复用其他容器(vector,list),对他们进行封装
核心接口 push,pop ,top
容器适配器
利用模版定义一个参数
库里面好像没有适配器是因为缺省参数deque (双端队列)
allocator
是内存池(空间配置器)不常用
deque(双端队列,适合在两端插入删除)
看起来像是六边形战士 不如vector【】访问
顺序表物理空间连续,可以
高效的下标访问(但是扩容代价大),中间或者头部插入删除效率低
链表不可以
任意位置插入删除效率高, 但是不支持下标随机访问
deque底层(中控数组)
头插尾插
因为第一个数组只有一个 5
整体挪动数据,buff大小不改变但是效率低
对单个buff的第i位置删除或者扩容效率高了,但是每个buff大小不一样
总结:
实际中deque不常用,下边随机访问还带看vector ,如果说头尾插入删除deque还不错,作为栈和队列的适配器还不错,略优于vector(没有扩容尾插(vector尾插需要遍历)),list(不用每次插入删除都要开辟空间)。
简单了解deque
Queue
队尾插入队头删除
vector不支持(没有头删这个接口)