当前位置: 首页 > news >正文

C++STL剖析(四)—— stack和queue的概念和使用

文章目录

  • 1. stack的介绍
  • 2. stack的构造
  • 3. stack的使用
    • 🍑 push
    • 🍑 top
    • 🍑 pop
    • 🍑 empty
    • 🍑 size
    • 🍑 swap
    • 🍑 emplace
  • 4. queue的介绍
  • 5. queue的构造
  • 6. queue的使用
    • 🍑 push
    • 🍑 size
    • 🍑 front
    • 🍑 back
    • 🍑 pop
    • 🍑 empty
    • 🍑 swap
    • 🍑 emplace
  • 7. 容器适配器
    • 🍑 什么是适配器
    • 🍑 stack和queue的底层结构
    • 🍑 deque的原理介绍
    • 🍑 deque的缺陷
    • 🍑 选择deque的原因
  • 8. 模拟实现「stack」和「queue」
    • 🍑 stack的模拟实现
    • 🍑 queue的模拟实现
  • 9. 总结


1. stack的介绍

「stack」是一种 容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。

在这里插入图片描述

可以看到「stack」是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。

在这里插入图片描述

也就是说, 「stack」的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:

  • empty:判空操作
  • back:获取尾部元素操作
  • push_back:尾部插入元素操作
  • pop_back:尾部删除元素操作

标准容器 vector、deque、list 均符合上面这些需求,默认情况下,如果没有为「stack」指定特定的底层容器,默认情况下使用 deque。

2. stack的构造

它的构造方式如下:

在这里插入图片描述

(1)使用默认的适配器构造一个空栈

stack<int> st1;

(2)使用其他的容器适配器构造一个空栈

stack<int, vector<int>> st2;
stack<int, list<int>> st3;

3. stack的使用

相对于前面学习的容器,「Stack」的接口更简单也更少,基本的使用函数如下。

🍑 push

在堆栈顶部插入一个新元素,位于其当前顶部元素之上。

在这里插入图片描述

代码示例

void test_stack()
{stack<int> st;st.push(1);st.push(2);st.push(3);st.push(4);st.push(5);
}

🍑 top

返回堆栈顶部元素的引用。

在这里插入图片描述

代码示例

void test_stack()
{stack<int> st;st.push(1);st.push(2);st.push(3);st.push(4);st.push(5);cout << st.top() << endl;
}

运行结果

在这里插入图片描述

🍑 pop

删除堆栈顶部的元素,有效地将其大小减小 1。

在这里插入图片描述

代码示例

void test_stack()
{stack<int> st;st.push(1);st.push(2);st.push(3);st.push(4);st.push(5);cout << st.top() << endl;st.pop();cout << st.top() << endl;
}

可以看到,最开始栈顶元素是 5,删除以后,就变成了 4

在这里插入图片描述

🍑 empty

返回堆栈是否为空,即它的大小是否为 0。

在这里插入图片描述

因为栈是不支持遍历的,所以这个接口可以用来实现栈的遍历。

void test_stack()
{stack<int> st;st.push(1);st.push(2);st.push(3);st.push(4);st.push(5);while (!st.empty()){cout << st.top() << " ";st.pop();}}

运行结果

在这里插入图片描述

🍑 size

返回栈中元素的数量。

在这里插入图片描述

代码示例

void test_stack()
{stack<int> st;st.push(1);st.push(2);st.push(3);st.push(4);st.push(5);st.push(6);st.push(7);st.push(8);st.push(9);st.push(10);cout << st.size() << endl;
}

运行结果

在这里插入图片描述

🍑 swap

将容器适配器(*this)的内容与 x 的内容交换。

其实就是交换两个栈的元素数据。

在这里插入图片描述

代码示例

void test_stack()
{stack<int> st1;st1.push(1);st1.push(2);st1.push(3);st1.push(4);st1.push(5);stack<int> st2;st2.push(6);st2.push(7);st2.push(8);st2.push(9);st2.push(10);st1.swap(st2);while (!st1.empty()) {cout << st1.top() << " ";st1.pop();}while (!st2.empty()) {cout << st2.top() << " ";st2.pop();}
}

运行结果

在这里插入图片描述

🍑 emplace

在栈顶部添加一个新元素,位于其当前顶部元素之上。

在适当的位置构造这个新元素,并将 args 作为其构造函数的参数传递。

在这里插入图片描述

代码示例

void test_stack()
{stack<int> st;st.push(1);st.push(2);st.push(3);st.push(4);st.push(5);st.emplace(10);while (!st.empty()) {cout << st.top() << " ";st.pop();}
}

可以看到这个函数确实没啥用处…

在这里插入图片描述

4. queue的介绍

「队列 Queue」是一种容器适配器,专门用于在 FIFO 上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。

在这里插入图片描述

可以看到「queue」也是作为容器适配器实现的,容器适配器即将特定容器类封装作为其底层容器类,「queue」提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。

在这里插入图片描述

底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:

  • empty:检测队列是否为空
  • size:返回队列中有效元素的个数
  • front:返回队头元素的引用
  • back:返回队尾元素的引用
  • push_back:在队列尾部入队列
  • pop_front:在队列头部出队列

标准容器类 deque 和 list 满足了这些要求。默认情况下,如果没有为 queue 实例化指定容器类,则使用标准容器 deque。

5. queue的构造

它的构造方式如下:

在这里插入图片描述

(1)使用默认的适配器构造一个空栈

queue<int> q1;

(2)使用其他的容器适配器构造一个空栈

queue<int, vector<int>> q2;
queue<int, list<int>> q2;

6. queue的使用

相对于前面学习的容器,「queue」的接口更简单也更少,基本的使用函数如下。

🍑 push

在队列的末尾插入一个新元素,位于当前最后一个元素之后。

在这里插入图片描述

代码示例

void test_queue()
{queue<int> q;q.push(1);q.push(2);q.push(3);q.push(4);q.push(5);
}

🍑 size

返回队列中元素的数量。

在这里插入图片描述

代码示例

void test_queue()
{queue<int> q;q.push(1);q.push(2);q.push(3);q.push(4);q.push(5);cout << q.size() << endl;
}

运行结果

在这里插入图片描述

🍑 front

返回对队列中下一个元素的引用。

也就是获取队头的元素。

在这里插入图片描述

代码示例

void test_queue()
{queue<int> q;q.push(1);q.push(2);q.push(3);q.push(4);q.push(5);cout << q.front() << endl;
}

运行结果

在这里插入图片描述

🍑 back

返回对队列中最后一个元素的引用。

也就是获取队尾元素。

在这里插入图片描述

代码示例

void test_queue()
{queue<int> q;q.push(1);q.push(2);q.push(3);q.push(4);q.push(5);cout << q.back() << endl;
}

运行结果

在这里插入图片描述

🍑 pop

删除队列中的下一个元素,有效地将其大小减少 1。

也就是删除队头元素

在这里插入图片描述

代码示例

void test_queue()
{queue<int> q;q.push(1);q.push(2);q.push(3);q.push(4);q.push(5);q.pop(); // 删除队头元素cout << q.size() << endl;cout << q.front() << endl;
}

运行结果

在这里插入图片描述

🍑 empty

返回队列是否为空,即队列大小是否为 0。

在这里插入图片描述

因为队列是先进先出,不支持遍历的,所以这个接口可以用来实现队列的遍历。

void test_queue()
{queue<int> q;q.push(1);q.push(2);q.push(3);q.push(4);q.push(5);q.push(6);while (!q.empty()) {cout << q.front() << " ";q.pop();}}

运行结果

在这里插入图片描述

🍑 swap

将容器适配器(*this)的内容与 x 的内容交换。

其实就是交换两个队列中的元素数据。

在这里插入图片描述

代码示例

void test_queue()
{queue<int> q1;q1.push(1);q1.push(2);q1.push(3);q1.push(4);q1.push(5);q1.push(6);queue<int> q2;q2.push(8);q2.push(9);q2.push(10);q1.swap(q2);while (!q1.empty()) {cout << q1.front() << " ";q1.pop();}while (!q2.empty()) {cout << q2.front() << " ";q2.pop();}
}

运行结果

在这里插入图片描述

🍑 emplace

在队列的末尾添加一个新元素,位于当前最后一个元素之后。

在适当的位置构造这个新元素,并将 args 作为其构造函数的参数传递。

在这里插入图片描述

代码示例

void test_queue()
{queue<int> q1;q1.push(1);q1.push(2);q1.push(3);q1.push(4);q1.push(5);q1.push(6);while (!q1.empty()) {cout << q1.front() << " ";q1.pop();}q1.emplace(100);while (!q1.empty()) {cout << q1.front() << " ";q1.pop();}
}

这个接口和 stack 一样,没太大用处…

在这里插入图片描述

7. 容器适配器

🍑 什么是适配器

适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。

在这里插入图片描述

🍑 stack和queue的底层结构

虽然「stack」和「queue」中也可以存放元素,但在 STL 中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为「stack」和「queue」只是对其他容器的接口进行了包装,STL 中「queue」和「queue」默认使用「deque」比如:

在这里插入图片描述

注意:容器支持迭代器,但是容器适配器不支持迭代器,因为栈和队列这种数据结构不能随便去遍历,不然会导致性质不易维护。

🍑 deque的原理介绍

「双端队列 deque」:是一种双开口的 “连续” 空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1)O(1)O(1),与「vector」比较,头插效率高,不需要搬移元素;与「list」比较,空间利用率比较高。

在这里插入图片描述

「deque」并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际「deque」类似于一个动态的二维数组,其底层结构如下图所示:

在这里插入图片描述

双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护其 “整体连续” 以及随机访问的假象,落
在了「deque」的迭代器身上,因此「deque」的迭代器设计就比较复杂,如下图所示:

在这里插入图片描述

那「deque」是如何借助其迭代器维护其假想连续的结构呢?

在这里插入图片描述

🍑 deque的缺陷

「vector」的优缺点:

  • 优点:适合尾插尾删,随机访问
  • 缺点:不适合头部或者中部插入删除,效率低,需要挪动数据;扩容有一定性能消耗,还可能存在一定程度的空间浪费。

「list」的优缺点:

  • 优点:任意位置插入删除效率高;按需申请释放空间。
  • 缺点:不支持随机访问;cpu 高速缓存命中低

「deque」就是结合了「vector」和「list」的优缺点而发明的!!!

与「vector」比较,「deque」的优势是:头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时,也不需要搬移大量的元素,因此其效率是比「vector」高的。

与「list」比较, 其底层是连续空间,空间利用率比较高,不需要存储额外字段。

但是,「deque」有一个致命缺陷: 不适合遍历!因为在遍历时,「deque」的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下,而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑「vector」和「list」。

「deque」的应用并不多,而目前能看到的一个应用就是,STL 用其作为「stack」和「queue」的底层数据结构。

🍑 选择deque的原因

为什么选择「deque」作为「stack」和「queue」的底层默认容器?

「stack」是一种后进先出的特殊线性数据结构,因此只要具有 push_back()pop_back() 操作的线性结构,都可以作为「stack」的底层容器,比如「vector」和「list」都可以;

「queue」是先进先出的特殊线性数据结构,只要具有 push_back()pop_back() 操作的线性结构,都可以作为「queue」的底层容器,比如「list」。

但是 STL 中对「stack」和「queue」默认选择「deque」作为其底层容器,主要是因为:

  • 「stack」和「queue」不需要遍历(因此 stack 和 queue 没有迭代器),只需要在固定的一端或者两端进行操作。
  • 在「stack」中元素增长时,「queue」比「vector」的效率高(扩容时不需要搬移大量数据)
  • 「queue」中的元素增长时,「deque」不仅效率高,而且内存使用率高。

总的来说,就是结合了「deque」的优点,而完美的避开了其缺陷。

8. 模拟实现「stack」和「queue」

🍑 stack的模拟实现

关于 stack 的模拟实现很简单,主要就是针对一些常用的接口,具体代码如下:

namespace edc
{template<class T, class Container = deque<T>>class Stack{public:// 入栈void push(const T& x){_con.push_back(x);}// 出栈void pop(){_con.pop_back();}// 获取栈顶元素T& top(){return _con.back();}const T& top() const{return _con.back();}//获取栈中有效元素个数size_t size() const{return _con.size();}//判断栈是否为空bool empty() const{return _con.empty();}//交换两个栈中的数据void swap(Stack<T, Container>& st){_con.swap(st._con);}private:Container _con;};// 测试函数void test_stack(){Stack<int> st;st.push(1);st.push(2);st.push(3);st.push(4);st.push(5);st.push(6);cout << "栈中元素个数:" << st.size() << endl;cout << "出栈顺序:";while (!st.empty()) {cout << st.top() << " ";st.pop();}}
}

测试结果:

在这里插入图片描述

🍑 queue的模拟实现

关于 queue 的模拟实现也很简单,主要就是针对一些常用的接口,具体代码如下:

namespace edc
{template<class T, class Container = deque<T>>class Queue{public:// 入队void push(const T& x){_con.push_back(x);}// 出队void pop(){_con.pop_front();}// 获取队头元素T& front(){return _con.front();}const T& front() const{return _con.front();}// 获取队尾元素T& back(){return _con.back();}const T& back() const{return _con.back();}//获取队列中有效元素个数size_t size() const{return _con.size();}//判断队列是否为空bool empty() const{return _con.empty();}//交换两个栈中的数据void swap(Queue<T, Container>& q){_con.swap(q._con);}private:Container _con;};// 测试函数void test_queue(){Queue<int> q;q.push(1);q.push(2);q.push(3);q.push(4);q.push(5);q.push(6);q.push(7);cout << "队列中元素个数:" << q.size() << endl;cout << "出队顺序:";while (!q.empty()) {cout << q.front() << " ";q.pop();}}
}

测试结果:

在这里插入图片描述

9. 总结

对于栈和队列,我相信只要数据结构的基础还不错,那么本篇文章的接口函数肯定是手到擒来!

最后我们再看一下栈和队列在实际生活中的应用吧。

栈典型应用:

  • 浏览器中的后退与前进、软件中的撤销与反撤销。 每当我们打开新的网页,浏览器就讲上一个网页执行入栈,这样我们就可以通过「后退」操作来回到上一页面,后退操作实际上是在执行出栈。如果要同时支持后退和前进,那么则需要两个栈来配合实现。
  • 程序内存管理。 每当调用函数时,系统就会在栈顶添加一个栈帧,用来记录函数的上下文信息。在递归函数中,向下递推会不断执行入栈,向上回溯阶段时出栈。

队列典型应用:

  • 淘宝订单。 购物者下单后,订单就被加入到队列之中,随后系统再根据顺序依次处理队列中的订单。在双十一时,在短时间内会产生海量的订单,如何处理「高并发」则是工程师们需要重点思考的问题。
  • 各种待办事项。 例如打印机的任务队列、餐厅的出餐队列等等。

相关文章:

C++STL剖析(四)—— stack和queue的概念和使用

文章目录1. stack的介绍2. stack的构造3. stack的使用&#x1f351; push&#x1f351; top&#x1f351; pop&#x1f351; empty&#x1f351; size&#x1f351; swap&#x1f351; emplace4. queue的介绍5. queue的构造6. queue的使用&#x1f351; push&#x1f351; size…...

流浪地球 | 建筑人是如何看待小破球里的黑科技的?

大家好&#xff0c;这里是建模助手。 想问问大家今年贺岁档&#xff0c;都跟上没有&#xff0c;今天请允许我蹭一下热点表达一下作为一个科幻迷的爱国之情。 抛开大刘的想象力、各种硬核科技&以及大国情怀不提&#xff0c;破球2中的传承还是让小编很受感动&#xff0c;无…...

软中断在bottom-half中调用

https://www.bilibili.com/read/cv20785285/简介软中断可以在两个位置得到机会执行&#xff1a;硬中断返回前 irq_exit中断下半部 Bottom-half Enable后情景分析情景1spin_unlock_bh__raw_spin_unlock_bh__local_bh_enable_ip 打开Bottom-half&#xff0c;并让softirq有机会…...

GEE遥感云大数据在林业中的应用

近年来遥感技术得到了突飞猛进的发展&#xff0c;航天、航空、临近空间等多遥感平台不断增加&#xff0c;数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量猛增&#xff0c;遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…...

Apollo架构篇 - 客户端架构

前言 本文基于 Apollo 1.8.0 版本展开分析。 客户端 使用 Apollo 支持 API 方式和 Spring 整合两种方式。 API 方式 API 方式是最简单、高效使用使用 Apollo 配置的方式&#xff0c;不依赖 Spring 框架即可使用。 获取命名空间的配置 // 1、获取默认的命名空间的配置 C…...

JVM调优最全面的成长 :参数详解+垃圾算法+示例展示+类文件到源码+面试问题

目录1.优秀的Java开发者1.1 什么是Java&#xff1f;1.2 编程语言1.3 计算机[硬件]能够懂的语言1.3.1 计算机发展史1.3.2 计算机体系结构1.3.3 计算机处理数据过程1.3.4 机器语言1.3.5 不同厂商的CPU1.3.6 操作系统1.3.7 汇编语言1.3.8 高级语言1.3.9 编译型和解释型1.3.9.1 编译…...

linux驱动常用函数

以下为一些常见用户态函数在内核中的替代&#xff0c;包括头文件和函数声明&#xff1a;1、动态申请内存&#xff1a;linux/vmalloc.hvoid *vmalloc(unsigned long size);void vfree(const void *addr);2、字符串操作&#xff1a;linux/string.hvoid * memset(void *,int,__ker…...

Flowable进阶学习(九)数据对象DataObject、租户Tenant、接收任务ReceiveTask

文章目录一、数据对象DataObject二、租户 Tenant三、接收任务 ReceiveTask案例一、数据对象DataObject DataObject可以⽤来定义⼀些流程的全局属性。 绘制流程图&#xff0c;并配置数据对象&#xff08;不需要选择任意节点&#xff09; 2. 编码与测试 /*** 部署流程*/ Test…...

C语言实现五子棋(n子棋)

五子棋的历史背景&#xff1a; 五子棋起源于中国&#xff0c;是全国智力运动会竞技项目之一&#xff0c;是一种两人对弈的纯策略型棋类游戏。双方分别使用黑白两色的棋子&#xff0c;下在棋盘直线与横线的交叉点上&#xff0c;先形成五子连珠者获胜。五子棋容易上手&#xff0c…...

OpenStack云平台搭建(2) | 安装Keystone

目录 1、登录数据库配置 2、数据库导入Keystone表 3、配置http服务 4、创建域、用户 5、创建脚本 Keystone&#xff08;OpenStack Identity Service&#xff09;是 OpenStack 框架中负责管理身份验证、服务访问规则和服务令牌功能的组件。下面我们进行Keystone的安装部署 1…...

基于javaFX的固定资产管理系统

1. 总体设计 本系统分为登录模块、资产管理模块、资产登记模块和信息展示模块共四个模块。 登录模块的主要功能是&#xff1a;管理员通过登录模块登录本系统&#xff1b; 资产管理模块的主要功能有&#xff1a;修改、删除系统中的固定资产&#xff1b; 在资产登记模块中&#…...

板子登录和挂载问题记录

ubuntu登录板子问题 ssh登录ssh 10.1.3.15&#xff0c;显示No route to host 则尝试在板子上ping 本机ip 试一下 挂载 本地机器vim /etc/export编辑此内容并保存 /exports_0209/tda4_build *(rw,no_root_squash,nohide,insecure,no_subtree_check,async)1.挂载nfs方法 mou…...

二、Linux文件 - Open函数讲解实战

目录 1.Open函数讲解 2.open函数实战 2.1 man 1 ls 查询Shell命令 2.2 man 2 open 查看系统调用函数 2.3项目实战 2.3.1O_RDWR和O_CREAT 2.3.2O_APPEND的用法 1.Open函数讲解 高频使用的Linux系统调用&#xff1a;open write read close Linux自带的工具&#xf…...

源码分析Spring解决循环依赖的过程

循环依赖是之前很爱问的一个面试题&#xff0c;最近不咋问了&#xff0c;但是梳理Spring解决循环依赖的源码&#xff0c;会让我们对Spring创建bean的流程有一个清晰的认识&#xff0c;有必要搞一搞。开始搞之前&#xff0c;先参考了这个老哥写的文章&#xff0c;对Spring处理循…...

LabVIEW中加载.NET 2.0,3.0和3.5程序集

LabVIEW中加载.NET 2.0,3.0和3.5程序集已使用.NETFramework 2.0,3.0或3.5创建了.NET程序集&#xff0c;但是当尝试在构造函数节点中加载这些程序集时&#xff0c;却收到LabVIEW消息显示: 所选文件不是.NET程序集&#xff0c;所属类型库或自动化可执行文件。所以想确认是否可以在…...

Fluent Python 笔记 第 2 章 序列构成的数组

2.1 内置类型序列概览 容器序列&#xff08;能存放不同类型的数据&#xff09;&#xff1a;(作者分的类) list、tuple 和 collections.deque扁平序列&#xff08;只能容纳一种类型&#xff09;&#xff1a; str、byes、bytearray、memoryview 和 array.array可变&#xff1a…...

句子扩充法

人&#xff0c;物&#xff0c;时&#xff0c;地&#xff0c;事 什么人和什么物在什么时间什么地点发生了什么事。 思维导图&#xff1a;以人为中心&#xff0c;人具有客观能动性。 例如&#xff1a;秋燕南飞。 扩展为&#xff1a; 盘旋在洞庭湖上方的大雁渐渐消失了。“它们都…...

Java并发编程概述

在学习并发编程之前&#xff0c;我们需要稍微回顾以下线程相关知识&#xff1a;线程基本概念程序&#xff1a;静态的代码&#xff0c;存储在硬盘中进程&#xff1a;运行中的程序&#xff0c;被加载在内存中&#xff0c;是操作系统分配内存的基本单位线程&#xff1a;是cpu执行的…...

Java常见数据结构的排序与遍历(包括数组,List,Map)

数组遍历与排序 数组定义 //定义 int a[] new int[5]int[] a new int[5];//带初始值定义 int b[] {1,2,3,4,5};赋值 //定义时赋值 int b[] {1,2,3,4,5};//引用赋值 a[6] 1 a[9] 9 //未赋值为空取值 //通过下表取值&#xff0c;从0开始 b[1] 1 b[2] 2遍历 Test p…...

数据结构|绪论

&#x1f525;Go for it!&#x1f525; &#x1f4dd;个人主页&#xff1a;按键难防 &#x1f4eb; 如果文章知识点有错误的地方&#xff0c;请指正&#xff01;和大家一起学习&#xff0c;一起进步&#x1f440; &#x1f4d6;系列专栏&#xff1a;数据结构与算法 &#x1f52…...

内网渗透(十二)之内网信息收集-内网端口扫描和发现

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…...

RabbitMq相关面试题

文章目录消息队列有没有接触过&#xff1f; 简单介绍一下&#xff1f;消息中间件模式分类 &#xff1f;使用MQ有什么好处&#xff1f;MQ如何选型 &#xff1f;你们项目中用到过 MQ 吗&#xff1f;谈谈你对 MQ 的理解&#xff1f;MQ消费者消费消息的顺序一致性问题&#xff1f;R…...

树莓派开机自启动Python脚本或者应用程序

树莓派开机自启动Python脚本或者应用程序前言一、对于Python脚本的自启动方法1、打开etc/rc.local文件2、编辑输入需要启动的指令3、重启树莓派验证二、对于需要读写配置文件的应用程序的自启前言 在树莓派上写了一些Python脚本&#xff0c;还有一个java 的jar包想要在树莓派上…...

全国青少年编程等级考试scratch四级真题2022年9月(含题库答题软件账号)

青少年编程等级考试scratch真题答题考试系统请点击电子学会-全国青少年编程等级考试真题Scratch一级&#xff08;2019年3月&#xff09;在线答题_程序猿下山的博客-CSDN博客_小航答题助手1、运行下列程序&#xff0c;说法正确的是&#xff1f;&#xff08; &#xff09;A.列表…...

NodeJS与npm版本不一致时降级npm的方法

首先查看 Node.js 与 npm 版本对应关系&#xff1a;Node.js与npm版本查看。 安装 cnpm&#xff1a; npm install -g cnpm 查看一下 npm 和 cnpm 的镜像&#xff1a; npm config get registry cnpm config get registry 2 如果不是 https://registry.npm.taobao.org/ 的话就修…...

《C++ Primer Plus》第16章:string类和标准模板库(8)

关联容器 关联容器&#xff08;associative container&#xff09;是对容器概念的另一个改进。关联容器将值与键关联在一起&#xff0c;并使用键来查找值。例如&#xff0c;值可以表示雇员信息&#xff08;如姓名、地址、办公室号码、家庭电话和工作电话、健康计划等&#xff…...

Linux安装达梦8数据库

Linux安装达梦8数据库 服务器系统&#xff1a;centos7 数据库版本&#xff1a;达梦8 先获取安装包&#xff1a;https://eco.dameng.com/download/?_blank 选择相应版本下载,下载完解压之后会得到一个iso文件&#xff0c;把他上传到服务器上&#xff0c;建议上传到/opt目录下…...

[数据库]初识数据库

●&#x1f9d1;个人主页:你帅你先说. ●&#x1f4c3;欢迎点赞&#x1f44d;关注&#x1f4a1;收藏&#x1f496; ●&#x1f4d6;既选择了远方&#xff0c;便只顾风雨兼程。 ●&#x1f91f;欢迎大家有问题随时私信我&#xff01; ●&#x1f9d0;版权&#xff1a;本文由[你帅…...

Redis的缓存雪崩、击穿、穿透和解决方案

2.5 缓存穿透问题的解决思路 缓存穿透 &#xff1a;缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库。 常见的解决方案有两种&#xff1a; 缓存空对象 优点&#xff1a;实现简单&#xff0c;维护…...

52000000

选择题(共52题,合计52.0分) 1. 敏捷团队在项目执行过程中会用到一种叫做“看板”的可视化工具&#xff0c;它可显示WIP&#xff0c; 帮助识别瓶颈和过度承诺&#xff0c; 从而使团队能够优化工作流。请从下列选项中选择WIP的最佳解释?() A 等待初步加工的材料的库存 B 目前正…...

城乡建设管理局的网站/广州网站营销推广

在安装由Eclipse-Hadoop-Plugin的Eclipse中, 可以直接运行Hadoop的MapReduce程序, 但是如果什么都不配置的话你发现Eclipse控制台没有任何日志输出, 这个问题可以用以下方法进行解决: 首先在工程的src目录下新建 log4j.properties 日志配置文件, 只能在src目录, 其他目录不行 1…...

wordpress简洁风模板/seo优化信

叶子节点个数为n1&#xff0c;度为2的节点数为n2&#xff0c;用n2表示n1。 证&#xff1a;因为节点分为度为1,2,3,的所以设x节点总数。 xn1n2y(度为1) 边数1 2*n2y1 n1n2y2*n2y1 n2n1-1 转载于:https://www.cnblogs.com/wls001/p/4962439.html...

景德镇网站制作公司/营销网站定制公司

点击上方“Java基基”&#xff0c;选择“设为星标”做积极的人&#xff0c;而不是积极废人&#xff01;源码精品专栏 原创 | Java 2020 超神之路&#xff0c;很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库…...

国家级建设网站/如何优化关键词排名快速首页

Delphi的VCL框架在创建应用时TApplication是一个自动创建的隐藏窗口&#xff0c;其它创建的窗口是自动以该窗口为窗口&#xff0c;这就导致创始的主窗口在任务栏的系统菜单只有三项&#xff0c;只要在主窗口的Create事件中将系统菜单用Application的系统菜单替换&#xff0c;并…...

做中国旅游网站的目的与必要性/网络营销广告策划

我们在做Android项目开发过程中&#xff0c;经常会遇到这种情况&#xff0c;我们需要引入的aar、jar等所依赖的第三方依赖库与我们本地的依赖库的版本号不一致&#xff0c;造成我们项目编译失败&#xff0c;遇到这种情况时&#xff0c;我们只需要在module下的build.gradle文件中…...

网站页面上的悬浮窗怎么做/关键词林俊杰百度云

昨天周日去清华参加人民搜索笔试&#xff0c;人好多啊&#xff0c;据说简历收到了两千份&#xff0c;也不知道他们招多少人&#xff0c;估计签百度的人为了户口都杀回来了&#xff0c;估计竞争会很激烈。 考题的形式是前面是多不定项选择20个&#xff0c;后面是5个算法题&#…...