【C++/STL深度剖析】stack和queue的详细概念和使用(图文详解,初学者必看!!)

news2024/11/23 7:48:48

目录

一、前言

二、stack 的详细解析

🔥 stack的介绍🔥

🔥 stack的构造🔥

🔥 stack的常用接口🔥

💧push

💧top 

💧pop

💧empty 

💧size 

💧swap 

三、queue 的详细解析

🔥 queue的介绍🔥

🔥 queue的构造🔥

🔥 queue的常用接口🔥 

💧push 

💧size 

💧front 

💧back 

💧pop  

💧empty  

💧swap   

四、容器适配器 

🥝 什么是适配器 ?

🍍stack 和 queue 的底层结构

🍇deque的原理介绍 

🍑deque 的底层结构

🍉deque 的优缺点 

🍈  选择 deque 的原因

六、 模拟实现 【stack】和 【queue】

🔥 stack 的模拟实现🔥  

🔥 queue 的模拟实现🔥  

七、总结 

八、共勉 


一、前言

        最近在刷 leetcode  的时候,发现 stack和queue 都还没弄明白😖,但是 STL 的强大是众所周知滴,早晚都是要解决滴,因此专门写下这篇文章,以供自己复习和各位老铁使用,快速的回忆 stack和queue 的用法,让你找回自信,不用再竞赛的时候颜面尽失。
       本次博客主要讲解
stack和queue 的常用接口,由于篇幅过长,stack和queue 的常考面试题,下一篇博客来阐述,请大家持续关注我O!!

二、stack 的详细解析

🔥 stack的介绍🔥

【stack】是一种 特殊的数据结构,也是一种 容器适配器,主要特点为:【先进后出】,主要操作有:入栈、出栈、查看栈顶元素、判断栈空等在原则上是不允许进行 中部底部 操作的,这样会破坏栈结构的完整性。

从下图,可以看到 栈【stack】是作为容器适配器被实现,容器适配器对特定类封装作为其底层容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层,元素特定容器的尾部(即栈顶)被压入和弹出。(容器适配器本文的后面会详细讲解,这里先了解一下它 和 栈 的关系)

可以看出,栈有两个模板参数

  • 参数1:T 栈中的元素类型,同时也是底层容器中的元素类型
  • 参数2:Container 实现栈时用到的底层容器,这里为缺省参数,缺省结构为 双端队列 deque

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

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

标准容器 vector、deque、list 均符合上面的这些要求,默认情况下,如果没有为 【stack】指定特定的顶层容器,默认情况下使用 deque (这一点会在本文,后下容器适配器,详细讲解)


🔥 stack的构造🔥

它的构造方式如下:

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

stack<int> s; // 默认底层容器为 deque 

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

stack<int, vector<int>> sv;   // 显示实例化 底层容器为 vector
stack<int, list<int>> sl;     // 显示实例化,底层容器为 list

代码测试: 

#include <iostream>
#include <stack>
#include <vector>
#include <list>

using namespace std;

int main()
{
	stack<int> s;	//默认底层容器为 deque

	stack<int, vector<int>> sv;	//显示实例化底层容器为 vector
	
	stack<char, list<char>> sl;	//显示实例化底层容器为 list

	cout << typeid(s).name() << endl;	//查看具体类型
	cout << typeid(sv).name() << endl;
	cout << typeid(sl).name() << endl;

	return 0;
}

注意: 关于参数3 allocator 是空间配置器,这里先不作讲解,后续再学习

🔥 stack的常用接口🔥

相对于前面学习的容器(vector、list、string),【stack】的接口更简单也更少,基本的使用函数如下: 

💧push

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

代码示例: 

void test_stack()
{
	stack<int> st;  // 构造一个栈 对象 --- 此时为空栈,底层为 deque

	st.push(1);
	st.push(2);
	st.push(3);     // 向 栈 中插入 元素 【1,2,3,4,5】
	st.push(4);
	st.push(5);
}

💧top 

返回栈【stack】的顶部元素 

 代码示例:

void test_stack()
{
	stack<int> st;  // 构造一个栈 对象 --- 此时为空栈,底层为 deque

	st.push(1);
	st.push(2);
	st.push(3);     // 向 栈 中插入 元素 【1,2,3,4,5】
	st.push(4);
	st.push(5);

    cout << st.top() << endl; // 返回栈的 顶部元素  -- 【5】
}

运行结果展示: 


💧pop

 删除 栈【stack】顶部的元素,有效的将其空间大小 -- 减少 1

 代码示例:

void test_stack()
{
	stack<int> st;  // 构造一个栈 对象 --- 此时为空栈,底层为 deque

	st.push(1);
	st.push(2);
	st.push(3);     // 向 栈 中插入 元素 【1,2,3,4,5】
	st.push(4);
	st.push(5);

    cout << st.top() << endl; // 返回栈的 顶部元素  -- 【5】

    st.pop();                 // 删除栈顶元素 -- [5]
    
    cout << st.top() << endl; // 返回栈的 顶部元素  -- 【4】
}

 运行结果展示: 


💧empty 

返回栈【stack】是否为空,即它的空间大小是否为 0

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

代码示例:

void test_stack()
{
	stack<int> st;  // 构造一个栈 对象 --- 此时为空栈,底层为 deque

	st.push(1);
	st.push(2);
	st.push(3);     // 向 栈 中插入 元素 【1,2,3,4,5】
	st.push(4);
	st.push(5);

    while(!st.empty())
    {
        cout << st.top() << " ";
        st.pop();        
    }
}

 运行结果展示: 


💧size 

返回栈【stack】中元素个数 

 代码示例:

void test_stack()
{
	stack<int> st;  // 构造一个栈 对象 --- 此时为空栈,底层为 deque

	st.push(1);
	st.push(2);
	st.push(3);     // 向 栈 中插入 元素 【1,2,3,4,5】
	st.push(4);
	st.push(5);

    cout << st.size() << endl;  // 返回 栈 中的元素个数 -- 5个
}

💧swap 

将容器适配器(*this)的内容与 x 的内容进行交换,其实就是交换 两个栈 的元素数据 

 代码示例:

void test_stack()
{
	stack<int> st1;  // 构造一个栈 对象 --- 此时为空栈,底层为 deque

	st1.push(1);
	st1.push(2);
	st1.push(3);     // 向 栈 中插入 元素 【1,2,3】
	
    stack<int> st2;  // 构造一个栈 对象 --- 此时为空栈,底层为 deque

	st2.push(4);
	st2.push(5);
	st2.push(6);     // 向 栈 中插入 元素 【4,5,6】

    st1.swap(st2)   // 交换两个 栈 的数据

    // 遍历两个栈 
    while(!st1.empty())
    {
        cout << st1.top() << " ";    // 【6,5,4】
        st1.pop();  
    }
    
    while(!st2.empty())
    {
        cout << st2.top() << " ";    // 【3,2,1】
        st2.pop();  
    }

}

  运行结果展示: 


三、queue 的详细解析

🔥 queue的介绍🔥

队列 【queue】是一种特殊的数结构,同时也是一种 容器适配器,遵循先进先出FIFO原则,其中从容器一端插入元素,另一端提取元素。主要操作:入队、出队、判断队空、查看队头队尾元素等;队列在原则上 是不允许进行 中部 的操作,这样会破坏队列的完整性。

从下图,可以看到 队列【queue】是作为容器适配器被实现,容器适配器对特定类封装作为其底层容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层。元素从队尾入列,从队头出列。(容器适配器本文的后面会详细讲解,这里先了解一下它 和 队列 的关系)

可以看出,队列也有两个模板参数

  • 参数1:T 栈中的元素类型,同时也是底层容器中的元素类型
  • 参数2:Container 实现栈时用到的底层容器,这里为缺省参数,缺省结构为 双端队列 deque

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

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

标准容器 vector、deque、list 均符合上面的这些要求,默认情况下,如果没有为 【queue】指定特定的顶层容器,默认情况下使用 deque (这一点会在本文,后下容器适配器,详细讲解)


🔥 queue的构造🔥

 它的构造方式如下:

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

queue<int> q1;  // 默认底层容器为 deque 

 (2)使用其它的容器适配器构造一个 空队列

queue<int, vector<int>> q2;   // 显示实例化 底层容器为 vector
queue<int, list<int>> q2;     // 显示实例化,底层容器为 list

  代码示例:

#include <iostream>
#include<queue>
#include <vector>
#include <list>

using namespace std;

int main()
{
	queue<int> qDeque;	//默认使用 deque
	queue<double, vector<double>> qVector;	//指定使用 vector
	queue<char, list<char>> qList;	//指定使用 list

	cout << typeid(qDeque).name() << endl;	//查看具体类型
	cout << typeid(qVector).name() << endl;
	cout << typeid(qList).name() << endl;
	return 0;
}

  运行结果展示: 


🔥 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();
	}
}

 运行结果展示: 


四、容器适配器 

🥝 什么是适配器 ?

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

从应用角度出发,STL 中的适配器可以分为三类: 

  • 容器适配器 container adapters
  • 迭代器适配器 iterator adapters
  • 仿函数适配器 functor adapters

其中,容器适配器 可修改底层为指定容器,如由 vector 构成的、由 list 构成的队列;迭代器适配器可以 实现其他容器的反向迭代器(后续介绍);最后的仿函数适配器就厉害了,几乎可以 无限制的创造出各种可能的表达式

本文介绍的是容器适配器,即  和 队列,最后还会介绍一下常作为这两种容器适配器的默认底层容器 双端队列

🍍stack 和 queue 的底层结构

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

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


🍇deque的原理介绍 

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

🍑deque 的底层结构

deque(双端队列)的底层结构通常由多个固定大小的缓冲区组成,每个缓冲区是一个连续的存储块。这些缓冲区通过一个指向前一个缓冲区和一个指向后一个缓冲区的指针进行连接,形成了一个双向链表。

deque的内部缓冲区以分块的形式存储元素。每个缓冲区有一个固定的大小,它通常是2的幂次方,例如512、1024等。缓冲区中的元素被存储在数组中,以保持元素的连续性。

deque的双向链表由一个或多个缓冲区组成,每个缓冲区都包含一个指向前一个缓冲区和一个指向后一个缓冲区的指针。第一个缓冲区的指向前一个缓冲区的指针为空指针,最后一个缓冲区的指向后一个缓冲区的指针也为空指针。

当需要在deque的头部或尾部插入或删除元素时,只涉及到相关缓冲区的操作,而不会涉及其他缓冲区。这种设计使得deque的插入和删除操作时间复杂度为常数级别(O(1))。

🍉deque 的优缺点 

⭕deque(双端队列)在大多数情况下是非常高效且灵活的数据结构,但它也有一些缺点需要注意。 

【vector】的优缺点:

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

【list】的优缺点:

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

【deque】就结合了 【vector】和 【list】的优缺点而为之发明!!! 


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

【deque】 与 【list】相比较 的优势:其底层是连续空间,空间利用率较高,不需要存储额外字段

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


🍈  选择 deque 的原因

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

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

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

注意:string 、vector 不支持 头删,因此无法适配 queue


但是在 STL 中对 【stack】和 【queue】默认选择 【queue】作为其底层容器,原因为:

 【stack】 和 【queue】不需要遍历(因此stack 和 queue 没有迭代器),只需要在固定的一端或者两端进行操作。

在【satck】中元素增长时,【deque】比 【vector】的效率更高(扩容时不需要移动大量元素)

在【queue】中元素增长时,【deque】不仅效率高,而且内存使用率高

总结来说:【deque】结合了所有 【stack】 和 【queue】所需要的优点,而完美的避开了其缺陷


六、 模拟实现 【stack】和 【queue】

🔥 stack 的模拟实现🔥  

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

namespace xas
{
	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();
		}
	}
}

 测试结果:

适配器的厉害之处就在于 只要底层容器有我需要的函数接口,那么我就可以为其适配出一个容器适配器,比如 vector 构成的栈list 构成的栈deque 构成的栈,甚至是 string 也能适配出一个栈,只要符合条件,都可以作为栈的底层容器,当然不同结构的效率不同,因此库中选用的是效率较高的 deque 作为默认底层容器


🔥 queue 的模拟实现🔥  

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

namespace xas
{
	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();
		}
	}
}

  测试结果:


七、总结 

以上就是本篇关于 C++ STL学习之【stack和queue的详细概念和使用】的全部内容了,在本文中, 我们首先学习了 栈 和 队列 的基本概念和使用;其次学习了容器适配器,了解它存在的意义及种类;最后认识了容器适配器的默认底层容器 双端队列,见识了其复杂的结构设计及优缺点。

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

栈的典型应用:

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

队列的典型应用: 

  • 淘宝订单。购物者下单后,订单就被加入到队列之中,随后系统再根据顺序依次处理队列中的订单。在双十一时,在短时间内会产生海量的订单,如何处理【高并发】则是工程师们需要重点思考的问题。

八、共勉 

以下就是我对 【stack和queue的详细概念和使用】 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对 C++STL 的理解,请持续关注我哦!!!   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1888418.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

违规停放智能监测摄像机

对于现代城市管理来说&#xff0c;违规停放智能监测摄像机正逐渐成为解决交通拥堵和城市管理难题的重要工具。这类摄像机通过先进的视觉识别和数据分析技术&#xff0c;有效监控和管理道路上的车辆停放行为&#xff0c;对提升城市交通运行效率和改善市民出行环境具有显著的意义…

pytorch-ResNet18简单复现

目录 1. ResNet block2. ResNet18网络结构3. 完整代码3.1 网络代码3.2 训练代码 1. ResNet block ResNet block有两个convolution和一个short cut层&#xff0c;如下图&#xff1a; 代码&#xff1a; class ResBlk(nn.Module):def __init__(self, ch_in, ch_out, stride):su…

锻炼 读书笔记 番外 身体激素及神经递质

最近在读《锻炼》的时候&#xff0c;对于各种激素很感兴趣&#xff0c;多巴胺、内啡肽、荷尔蒙、肾上腺素、褪黑素、皮质醇、糖化、氧化等等。索性认真梳理下它们是什么&#xff0c;思考当处于心流状态时&#xff0c;人体发生什么样的变化&#xff0c;分泌什么激素&#xff1f;…

Milvus ConnectionRefusedError: how to connect locally

题意&#xff1a;怎样在本地连接到 Milvus 数据库。连接 Milvus 数据库被拒绝的错误 问题背景&#xff1a; I am trying to run a RAG pipeline using haystack & Milvus. 我正在尝试使用 haystack 和 Milvus 运行一个 RAG&#xff08;检索增强型生成&#xff09;管道。 …

10 - Python文件编程和异常

文件和异常 在实际开发中&#xff0c;常常需要对程序中的数据进行持久化操作&#xff0c;而实现数据持久化最直接简单的方式就是将数据保存到文件中。说到“文件”这个词&#xff0c;可能需要先科普一下关于文件系统的知识&#xff0c;对于这个概念&#xff0c;维基百科上给出…

重温被Mamba带火的SSM:HiPPO的一些遗留问题

©PaperWeekly 原创 作者 | 苏剑林 单位 | 科学空间 研究方向 | NLP、神经网络 书接上文&#xff0c;在上一篇文章《重温被Mamba带火的SSM&#xff1a;线性系统和HiPPO矩阵》中&#xff0c;我们详细讨论了 HiPPO 逼近框架其 HiPPO 矩阵的推导&#xff0c;其原理是通过正交…

MySQL的Geometry数据处理之WKB方案

MySQL的Geometry数据处理之WKT方案&#xff1a;https://blog.csdn.net/qq_42402854/article/details/140134357 MySQL的Geometry数据处理之WKT方案中&#xff0c;介绍WTK方案的优点&#xff0c;也感受到它的繁琐和缺陷。比如&#xff1a; 需要借助 ST_GeomFromText和 ST_AsTex…

Gradio 教程四:Building Generative AI Applications with Gradio

文章目录 一、使用interface构建NLP应用1.1 构建文本摘要应用1.1.1 设置API密钥1.1.2 调用文本摘要API1.1.3 运行本地模型获取响应1.1.4 使用interface构建应用 1.2 构建命名实体识别应用1.2.1 调用NER任务API1.2.2 使用interface构建应用1.2.3 加入额外函数&#xff0c;合并to…

C语言实战 | 用户管理系统

近期推出的青少年防沉迷系统&#xff0c;采用统一运行模式和功能标准。在“青少年模式”下&#xff0c;未成年人的上网时段、时长、功能和浏览内容等方面都有明确的规范。防沉迷系统为青少年打开可控的网络空间。 01、综合案例 防沉迷系统的基础是需要一个用户管理系统管理用户…

Unity3d C#实现基于UGUI ScrollRect的轮播图效果功能(含源码)

前言 轮播功能是一种常见的页面组件&#xff0c;用于在页面中显示多张图片/素材并自动或手动进行切换&#xff0c;以提高页面的美观度和用户体验。主要的功能是&#xff1a;自动/手动切换;平滑的切换效果;导航指示器等。可惜Unity的UGUI系统里没有现成的实现该功能&#xff0c…

[Labview] 改写表格内容并储存覆盖Excel

在上一个功能的基础上&#xff0c;新增表格改写保存功能 [Labview] Excel读表 & 输出表单中选中的单元格内容https://blog.csdn.net/Katrina419/article/details/140120584 Excel修改前&#xff1a; 修改保存后&#xff0c;动态改写储存Excel&#xff0c;并重新写入新的表…

使用antd的<Form/>组件获取富文本编辑器输入的数据

前端开发中&#xff0c;嵌入富文本编辑器时&#xff0c;可以通过富文本编辑器自身的事件处理函数将数据传输给后端。有时候&#xff0c;场景稍微复杂点&#xff0c;比如一个输入页面除了要保存富文本编辑器的内容到后端&#xff0c;可能还有一些其他输入组件获取到的数据也一并…

Go - 8.func 函数使用

目录 一.引言 二.func 定义 三.func 实践 1.多个返回值 2.命名返回值 3.可变参数 四.总结 一.引言 函数是编程语言中的基本构建块&#xff0c;用于将代码组织成可重用的逻辑单元。函数可以接受输入参数&#xff0c;执行特定的操作&#xff0c;并返回结果。在 Go 语言&a…

设计IC行业SAP软件如何处理芯片成本计算

在集成电路(IC)设计与制造行业中&#xff0c;精确的成本计算对于维持健康的财务状况、优化生产流程以及保持市场竞争力至关重要。SAP软件&#xff0c;作为一种全面的企业资源规划(ERP)解决方案&#xff0c;为IC行业提供了强大且灵活的成本计算工具。以下是SAP软件如何处理芯片成…

【python】OpenCV—Feature Detection and Matching

参考学习来自OpenCV基础&#xff08;23&#xff09;特征检测与匹配 文章目录 1 背景介绍2 Harris角点检测3 Shi-Tomasi角点检测4 Fast 角点检测5 BRIEF 特征描述子6 ORB(Oriented Fast and Rotated Brief) 特征描述子7 SIFT(Scale Invariant Feature Transform) 特征描述子8 SU…

​​​​​​​​​​​​​​Spark Standalone集群环境

目录 Spark Standalone集群环境 修改配置文件 【workers】 【spark-env.sh】 【配置spark应用日志】 【log4j.properties】 分发到其他机器 启动spark Standalone 启动方式1&#xff1a;集群启动和停止 启动方式2&#xff1a;单独启动和停止 连接集群 【spark-shel…

基于Hadoop平台的电信客服数据的处理与分析③项目开发:搭建基于Hadoop的全分布式集群---任务1:运行环境说明

任务描述 项目的运行环境是基于Hadoop的全分布式模式集群。 任务的主要内容是规划集群节点及网络使用&#xff0c;准备初始环境&#xff0c;关闭防火墙和Selinux。 任务指导 1. 基于Hadoop的全分布式模式集群&#xff0c;如下图所示&#xff1b; 2. 硬软件环境&#xff1a;…

Android性能优化面试题经典之ANR的分析和优化

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 造成ANR的条件 以下四个条件都可以造成ANR发生&#xff1a; InputDispatching Timeout&#xff1a;5秒内无法响应屏幕触摸事件或键盘输入事件 …

《企业实战分享 · MyBatis 使用合集》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; 近期刚转战 CSDN&#xff0c;会严格把控文章质量&#xff0c;绝不滥竽充数&#xff0c;如需交流&#xff…

Seatunnel本地模式快速测验

前言 SeaTunnel&#xff08;先前称为WaterDrop&#xff09;是一个分布式、高性能、易于扩展的数据集成平台&#xff0c;旨在实现海量数据的同步和转换。它支持多种数据处理引擎&#xff0c;包括Apache Spark和Apache Flink&#xff0c;并在某个版本中引入了自主研发的Zeta引擎…