【C++:STL之栈和队列 | 模拟实现 | 优先级队列 】
目录
1. stack的介绍和使用
1.1 stack的介绍
1.2 stack的使用
2 栈的模拟实现
3 queue的介绍和使用
3.1 queue的介绍
3.2 queue的使用
4 queue的模拟实现
5 deque的介绍
5.1deque的原理介绍
5.2 deque的缺陷
5.3 为什么选择deque作为stack和queue的底层默认容器
6 priority_queue的介绍和使用
6.1 priority_queue的介绍
6.2 priority_queue的使用
7 priority_queue的模拟实现
1. stack的介绍和使用
1.1 stack的介绍
栈的文档介绍
- 1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。
- 2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。
- 3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:
- empty:判空操作
- back:获取尾部元素操作
- push_back:尾部插入元素操作
- pop_back:尾部删除元素操作
- 4. 标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque。
1.2 stack的使用
这些使用我们C语言时学习栈和队列就已经很熟悉了:
函数说明 | 接口说明 |
stack() | 构造空的栈 |
empty() | 检测stack是否为空 |
size() | 返回stack中元素的个数 |
top() | 返回栈顶元素的引用 |
push() | 将元素val压入stack中 |
pop() | 将stack中尾部的元素弹出 |
2 栈的模拟实现
这儿与之前list的反向迭代器一样,用的时一种适配器模式,并不需要自己再造一遍轮子,我们打开stack官网看看官方对栈的介绍:
大家或许就有了疑问,这个deque<T>是个什么鬼呀?这个我们在下面会详细介绍,至于这里为啥会用deque<T>来作为缺省参数我们在下面讲解duque会给出详细解释。
接下来就给出stack的模拟实现:
namespace grm
{template<class T,class Container=deque<T>>class stack{private:Container _con;public:bool empty(){return _con.empty();}const T& top(){return _con.back();}void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}size_t size(){return _con.size();}};
}
用了适配器的原理写栈会轻松很多。
3 queue的介绍和使用
3.1 queue的介绍
队列的文档介绍
- 1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。
- 2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。
- 3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:
- empty:检测队列是否为空
- size:返回队列中有效元素的个数
- front:返回队头元素的引用
- back:返回队尾元素的引用
- push_back:在队列尾部入队列
- pop_front:在队列头部出队列
- 4. 标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque。
3.2 queue的使用
函数声明 | 接口说明 |
queue() | 构造空的队列 |
empty() | 检测队列是否为空,是返回true,否则返回false |
size() | 返回队列中有效元素的个数 |
front() | 返回队头元素的引用 |
back() | 返回队尾元素的引用 |
push() | 在队尾将元素val入队列 |
pop() | 将队头元素出队列 |
4 queue的模拟实现
namespace grm
{template<class T, class Container = deque<T>>class queue{private:Container _con;public:bool empty(){return _con.empty();}const T& front(){return _con.front();}const T& back(){return _con.back();}void push(const T& x){_con.push_back(x);}void pop(){_con.pop_front();}};
}
5 deque的介绍
5.1deque的原理介绍
deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,cpu高速缓存命中高,不会频繁申请释放空间。
起初deque设计出来是想要融合vector和list的优点想要代替他们,但是结果却差强人意。尽管deque与vector比较,头插效率高,与list比较,cpu高速缓存命中高。但是却比不了vector的O(1)的任意位置随机访问,list的任意位置O(1)插入删除。
所以deque是代替不了vector和list的,我们只需要大概了解一下原理,并不需要去模拟实现一下:
上面的中控器用的是一个指针数组维护的,用数组中的指针指向每一个buffer,buffer的具体大小是由编译器所决定的。
5.2 deque的缺陷
与vector比较,deque的优势是:头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时,也不需要搬移大量的元素,因此在这方面的效率是比vector高的。与list比较,其底层是连续空间,空间利用率比较高,不需要存储额外字段。但是,deque有一个致命缺陷:不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下,而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,而目前能看到的一个应用就是,STL用其作为stack和queue的底层数据结构。
5.3 为什么选择deque作为stack和queue的底层默认容器
stack是一种后进先出的特殊线性数据结构,因此只要具有push_back()和pop_back()操作的线性结构,都可以作为stack的底层容器,比如vector和list都可以;queue是先进先出的特殊线性数据结构,只要具有push_back和pop_front操作的线性结构,都可以作为queue的底层容器,比如list。但是STL中对stack和queue默认选择deque作为其底层容器,主要是因为:1. stack和queue不需要遍历(因此stack和queue没有迭代器),只需要在固定的一端或者两端进行操作。2. 在stack中元素增长时,deque比vector的效率高(扩容时不需要搬移大量数据);queue中的元素增长时,deque不仅效率高,而且内存使用率高。结合了deque的优点,而完美的避开了其缺陷。
6 priority_queue的介绍和使用
6.1 priority_queue的介绍
priority_queue的介绍
- 1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的(默认情况)。
- 2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。
- 3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。
- 4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过随机访问迭代器访问,并支持以下操作:
- empty():检测容器是否为空
- size():返回容器中有效元素个数
- front():返回容器中第一个元素的引用
- push_back():在容器尾部插入元素
- 5. 标准容器类vector和deque满足这些需求。默认情况下,如果没有为特定的priority_queue类实例化指定容器类,则使用vector。
- 6. 需要支持随机访问迭代器,以便始终在内部保持堆结构。容器适配器通过在需要时自动调用算法函数make_heap、push_heap和pop_heap来自动完成此操作。
6.2 priority_queue的使用
优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。注意: 默认情况下priority_queue是大堆。忘记了堆的老铁可以去看看博主讲解的这篇文章:http://http://t.csdn.cn/Buh2Qhttp://xn--http-u76a//t.csdn.cn/Buh2Q%E2%80%8B
函数声明 | 接口说明 |
priority_queue() priority_queue(first, last) | 构造一个空的优先级队列 |
empty( ) | 检测优先级队列是否为空,是返回true,否则返回false |
top( ) | 返回优先级队列中最大(最小元素),即堆顶元素 |
push(x) | 在优先级队列中插入元素x |
pop( ) | 删除优先级队列中最大(最小)元素,即堆顶元素 |
我们可以来试试:
priority_queue<int> pq;//仿函数为less,默认建立大堆pq.push(10);pq.push(1);pq.push(8);pq.push(3);pq.push(15);pq.push(16);while (!pq.empty()){cout << pq.top() << " ";pq.pop();}
至于为啥仿函数为less,但是建立的确是大堆这个是大佬们硬性规定的,大家也不要太过于较真。
要实现建立小堆我们调用一下greater仿函数即可。
priority_queue<int,vector<int>,greater<int>> pq;//显示调用仿函数为greater,建立小堆pq.push(10);pq.push(1);pq.push(8);pq.push(3);pq.push(15);pq.push(16);while (!pq.empty()){cout << pq.top() << " ";pq.pop();}
运行结果:
假如我们想比较自定义类型的大小应该咋办?直接用STL自带的仿函数好像并不能够完成,所以我们还得自己再实现一下仿函数。
先把日期类给整出来:
class Date
{friend ostream& operator<<(ostream& out, const Date& d);//友元声明
private:int _year;int _month;int _day;public:Date(int year = 1, int month = 1, int day = 1):_year(year), _month(month), _day(day){}bool operator<(const Date& d)const{return (_year < d._year) ||(_year == d._year && _month < d._month) ||(_year == d._year && _month == d._month && _day < d._day);}bool operator>(const Date& d)const{return (_year > d._year) ||(_year == d._year && _month > d._month) ||(_year == d._year && _month == d._month && _day > d._day);}
};ostream& operator<<(ostream& out, const Date& d)
{out << d._year << "/" << d._month << "/" << d._day << endl;return out;
}
大家这时心里可能会想:重载>>还好理解,因为要输出结果嘛,为啥你要重载>和<运算符呀?
不知道大家忘记了没,当我们建堆时有两种调整方式,向上调整和向下调整时都会设计数据的比较,内置类型没事,自定义类型就得我们重载比较运算符了,所以我们要想实现自定义类型的比较,这个是必不可少的。
然后我们就可以实现日期类的比较了:
priority_queue<Date, vector<Date>> pq;pq.push(Date(2023, 2, 7));pq.push(Date(2021, 2, 9));pq.push(Date(2023, 2, 8));pq.push(Date(2024, 2, 6));while(!pq.empty()){cout << pq.top() ;pq.pop();}
运行结果:
但是假如我们push的是日期类的地址,用系统自带的仿函数能够完成吗?
大家想想,由于push的是地址,所以比较的是地址的大小而不是地址指向的内容的大小,所以这种方法肯定是不合理的。
我们可以来试试:
很明显结果是不对的,尽管有时候碰巧结果恰好对的,也只是运气而已。
即我们还得自己写仿函数:
仿函数:
struct p_date_less{bool operator()(Date*& pd1, Date*& pd2){return *pd1 < *pd2;}};struct p_date_greater{bool operator()(Date*& pd1, Date*& pd2){return *pd1 > *pd2;}};
这样就能够正确比较了:
7 priority_queue的模拟实现
template<class T, class Container = vector<T>, class Compare = less<T>>class priority_queue{private:Container _con;void adjust_up(size_t child)//假设这里要建立大堆,默认仿函数是less{size_t parent = child - 1 >> 1;while (child > 0){//if (_con[child] > _con[parent])Compare cmp;//实例化出一个Cmpare的对象if (cmp(_con[parent],_con[child]))//由于仿函数中实现的是x<y{swap(_con[child], _con[parent]);child = parent;parent = child - 1 >> 1;}elsebreak;}}void adjust_down(size_t parent){size_t child = parent * 2 + 1;while (child < _con.size()){Compare cmp;//实例化出一个Cmpare的对象if (child + 1 < _con.size() && cmp(_con[child],_con[child+1]))//假如建立大堆,默认仿函数为less,就得满足_con[child]<_con[child+1]child += 1;//if (_con[child] > _con[parent])if (cmp(_con[parent],_con[child]))//由于仿函数中实现的是x<y{swap(_con[child], _con[parent]);parent = child;child = parent * 2 + 1;}elsebreak;}}public:priority_queue(){}template<class InputIterator>priority_queue(InputIterator first, InputIterator last):_con(){for (int i = _con.size() - 2 >> 1; i >= 0; i--)//向下建堆时间复杂度为O(N)adjust_down(i);}void push(const T& x){_con.push_back(x);adjust_up(_con.size() - 1);}void pop(){swap(_con[0], _con[size() - 1]);_con.pop_back();adjust_down(0);}const T& top(){return _con.front();}bool empty(){return _con.empty();}size_t size(){return _con.size();}};
这个之前在堆那一部分做了较为详细的讲解,这里就不在多说了。
相关文章:
【C++:STL之栈和队列 | 模拟实现 | 优先级队列 】
目录 1. stack的介绍和使用 1.1 stack的介绍 1.2 stack的使用 2 栈的模拟实现 3 queue的介绍和使用 3.1 queue的介绍 3.2 queue的使用 4 queue的模拟实现 5 deque的介绍 5.1deque的原理介绍 5.2 deque的缺陷 5.3 为什么选择deque作为stack和queue的底层默认容器 6 p…...
基于SpringBoot+Vue的疫苗预约管理系统(Java项目)
【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、…...
华为OD机试 - 计算网络信号(Python),真题含思路
计算网络信号 题目 网络信号经过传递会逐层衰减,且遇到阻隔物无法直接穿透,在此情况下需要计算某个位置的网络信号值。 注意:网络信号可以绕过阻隔物 array[m][n] 的二维数组代表网格地图,array[i][j] = 0 代表 i 行 j 列是空旷位置;array[i][j] = x ( x 为正整数)代表 i …...
【Spring】注解实现IOC操作,你理解了吗?
作者:狮子也疯狂 专栏:《spring开发》 坚持做好每一步,幸运之神自然会驾凌在你的身上 专栏推荐:写文章刚刚起步,各个专栏的知识点后续会补充完善,不断更新好文,希望大 家支持一下。 专栏名字El…...
微搭低代码从入门到精通01-总体介绍
在过去我们开发小程序,要学习各类知识。比如前端知识、后端知识、服务器知识及各种中间件及数据库的知识。 要想学会这些知识,既需要投入大量的学习时间,而且要经过相当的实践才可以掌握。 如果立志从事开发行业,投入精力去学习…...
类的继承
类的继承:一个类继承另一个类,自动拥有这个类的属性和方法,类似于包含与被包含的关系。被继承的类称为父类--子类则是继承父类的类。一个父类可以有多个子类;一个子类可以有多个父类(多继承)问题创建子类时…...
应用场景一:西门子PLC通过桥接器连接MQTT服务器
应用场景描述: 云平台、MES等数据采集、设备管理系统,需要通过MQTT的方式,上传和下发数据,MQTT服务器可以获取PLC的实时状态数据,也可以下发控制指令。桥接器提供4G、WIFI和有线三种连接方式。 网络拓扑:…...
计算机组成原理(四)
1.理解存储器的分类方法;理解存储器的层次结构;熟悉存储器的几个技术指标(主要是存储容量、存取时间、存取周期、存储器带宽等); 存储器分类方法: 按与CPU的连接和功能分类: 主存储…...
状态机设计举例
⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。 🔥文章和代码已归档至【Github仓库…...
Kubernetes1.25中Redis单机和集群部署实例二
1、概述我们知道在 Kubernetes 容器编排平台中, 我们可以非常方便的进行应用的扩容缩, 同时也能非常方便的进行业务的迭代,本章主要讲解在Kubernetes1.25搭建Redis单实例和Redis集群主从同步的环境流程步骤, 如果是高频访问重要的线上业务我们最好是部署在物理机器上…...
【STM32】【HAL库】遥控关灯0 概述
相关连接 【STM32】【HAL库】遥控关灯0 概述 【STM32】【HAL库】遥控关灯1主机 【STM32】【HAL库】遥控关灯2 分机 【STM32】【HAL库】遥控关灯3 遥控器 需求 家里有几个房间,开关距离床都挺远的 睡觉想要关灯的时候需要下床 因此设计了本次项目 需要满足以下要求: 可以控…...
C语言学习笔记(三): 选择结构程序设计
if语句 if(){} if (a1){printf("hehe");} //单独一个ifif(){}else{} int a 1, b 2;if (a b) {printf("haha"); //if else}else{printf("hehe");}if(){}else if(){} int a 1, b 2;if (a b) {printf("haha");}else if (a …...
图----无向图
1.定义 图的定义:图是由一组顶点和一组能够将两个顶点相连的边组成 边:edge 顶点:vertex 连通图:如果从任意一个顶点都存在一条路径到达另外一个任意顶点,我们称这幅图是连通图。 非连通图:由若干连通的…...
【C++1】函数重载,类和对象,引用,/string类,vector容器,类继承和多态,/socket,进程信号
文章目录1.函数重载:writetofile(),Ctrue和false,C0和非02.类和对象:vprintf构造函数:对成员变量初始化析构函数:一个类只有一个,不允许被重载3.引用:C中&取地址,C中…...
JetpackCompose从入门到实战学习笔记8—ConstraintLayout的简单使用
JetpackCompose从入门到实战学习笔记8—ConstraintLayout的简单使用 1.简介: Compose 中的 ConstraintLayout ConstraintLayout 是一种布局,让您可以相对于屏幕上的其他可组合项来放置可组合项。它是一种实用的替代方案,可代替使用多个已嵌…...
Spring Boot 快速入门(绝对经典)
目录 1、理论概述 1.1、什么是Spring Boot? 1.2、Spring Boot的特点 1.3、开发环境 2、实战——创建和配置项目 2.1、Spring Boot项目创建的两种方式 2.1.1、方法一:通过网站构建项目 2.1.2、使用Spring Initializr创建(推荐) 2.2、…...
golang context上下文
文章目录一、为什么需要context二、context 接口三、Background 方法四、 with 系列函数1、WithCancel 方法2、WithDeadline 方法3、WithTimeout 方法4、WithValue 方法五、使用注意事项一、为什么需要context 在 Go http包的Server中,每一个请求在都有一个对应的 …...
Linux---Linux是什么
Linux 便成立的核心网站: http://www.kernel.org Linux是什么 Linux 就是一套操作系统 Linux 就是核心与系统呼叫接口那两层 软件移植:如果能够参考硬件的功能函数并据以修改你的操作系统程序代码, 那经过改版后的操作系统就能够在另一个硬…...
C语言(Tgmath.h库(C99),exit和atexit)
一.Tgmath.h库(C99) C99标准提供得tgmath.h头文件定义了泛型类型宏。比如在math.h中为一个函数定义了3中类型(float,double和long double)的版本,那么tgmath.h文件就创建一个泛型类型宏,与原来的float,double和long double版本的…...
LeetCode 刷题系列 -- 739. 每日温度
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。示例 1:输入:temperatures …...
如何生成毕业论文的目录和创建模板
有粉丝同学最近在写毕业论文,其中比较让人恼火的是毕业论文的目录,折腾了几遍没弄好,想让我写个简单地教程,那就来吧。主要分为三步:第一步是从模板里面提取标题的样式,第二步是对自己的论文使用设置好的标…...
新来的23岁软件测试员上来秀了波操作,把几个老员工看傻了
春招了,公司来了个小伙子,一看简历,嘿?22岁,这不刚毕业的小毛孩子嘛,结果没想到人家上来就把现有项目的性能优化了一遍,给公司节省了一半的成本,这种“王炸”打法,直接给…...
Window10开放某个端口
需求:由于防火墙原因,开放某个端口:如9999 在开始那里搜索防火墙-进入防火墙 第一步:核实是否启动了防火墙,之后进行 第二步:点击“高级设置”,→“入站规则”→“新建规则”→“端口”→ “下一步” …...
进阶7 分页查询
进阶7 分页查询!!! 目录概述练习题概述 应用场景:当要显示的数据一页显示不全,需要分页提交SQL请求 语法: select 查询列表 from 表名 【join type join 表2 on 连接条件 where 筛选条件 group by 分组字段…...
利用升序定时器链表处理非活动连接
参考自游双《Linux高性能服务器编程》 背景 服务器同常需要定期处理非活动连接:给客户发一个重连请求,或关闭该连接,或者其他。我们可以通过使用升序定时器链表处理非活动连接,下面的代码利用alarm函数周期性的触发SIGALRM信号&a…...
MySQL 开发规范
一、数据库命名规范所有数据对象名称必须小写 :db_user禁止使用MySQL 保留关键字,若是则引用 临时表以tmp_ 开头,备份表以bak_ 开头并以时间戳结尾所有存储相同数据的列名和列类型必须一致二、数据库基本设计规范1、MySQL…...
【C语言进阶】预处理与程序环境
目录一.详解编译与链接1.前言2.翻译环境3.剖析编译过程4.运行环境二.预处理详解1.预定义符号2.剖析#define(1).定义标识符(2).定义宏(3).替换规则(4).#和##(5).宏与函数的对比(6).#undef3.条件编译4.文件包含(1).头文件包含的方式(2).嵌套文件包含一.详解编译与链接 1.前言 在…...
【Docker知识】将环境变量传递到容器
一、说明 程序通常通过与软件捆绑在一起的配置来控制操作,环境变量允许用户在运行时设置它们。但是,在 Docker 容器中运行进程会使事情变得复杂,那么如何将环境变量传递给容器呢?下面介绍若干个传递办法。 二、环境变量有何用途 环…...
Allegro如何更改铜皮显示密度操作指导
Allegro如何更改铜皮显示密度操作指导 用Allegro做PCB设计的时候,铜皮正常显示模式如下图 铜皮的密度是基本填充满的,Allegro支持更改铜皮的显示密度 如下图 如何更改密度,具体操作如下 点击setup...
ThinkPHP5酒店预订管理系统
有需要请私信或看评论链接哦 可远程调试 ThinkPHP5酒店预订管理系统一 介绍 此酒店预订管理系统基于ThinkPHP5框架开发,数据库mysql,采用了ueditor富文本编辑器。系统角色分为用户,员工和管理员。用户可注册登录并预订酒店和评论等ÿ…...
wordpress 百科插件/seo研究中心vip教程
sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程…...
注册了网站之后怎么设计/长沙网站外包公司
Linux磁盘和文件系统管理 Table of Contents 1 EXT2文件系统2 文件系统的简单操作3 磁盘的分割,格式化,检验与挂载4 设定开机挂载5 内存转换空间的建立6 文件系统的特殊观察与操作1 EXT2文件系统 一个文件的信息包含 1)文件的内容,即数据 ,放…...
网站建设华威公司怎么样/厦门网站设计公司
3.1 研究背景及意义 居民消费水平是按国民收入或国内生产总值的使用总量中用于居民消费的总额除以年平均人口计算的,它反映一个国家或一个地区居民的一般消费水平。居民消费水平是GDP中一个重要组成部分,是拉动经济增长的三驾马车之一,一直…...
微信分享的h5网站开发/seo指的是
最近刚学python,遇到上传下载文件功能需求,记录下! django web项目,前端上传控件用的是uploadify。 文件上传 - 后台view 的 Python代码如下: csrf_exempt require_http_methods(["POST"]) def uploadFiles(request): t…...
个人网站建设价格表/在线生成个人网站源码
uva-141-枚举 旋转过程的下标变化,画个2x2的表格,模拟就可以出来了 #include <string> #include<iostream> #include<map> #include<memory.h> #include<vector> #include<algorithm>namespace cc {using std::cout;using std:…...
装修设计公司属于什么行业/seo整站优化方案
dnsrecon kali工具可以进行域名爆破 步骤 创建字典:vim dns.dic ,写入字典输入dnsrecon -d badu.com -D /tmp/1901/dic/dns.dic -t brt其中,字典一定要是绝对路径-d表示domain,-D表示路径名 -t表示爆破方法type Type of enume…...