C++基础12:标准模板库

news2024/11/27 16:26:13

此专栏为移动机器人知识体系下的编程语言中的 C {\rm C} C++从入门到深入的专栏,参考书籍:《深入浅出 C {\rm C} C++》(马晓锐)和《从 C {\rm C} C C {\rm C} C++精通面向对象编程》(曾凡锋等)。



11.标准模板库
11.1 泛型化编程与STL简介
  • 泛型化编程思想是一种将程序要处理的数据类型参数化的设计思想模式;

  • 泛型化编程的基本思想:在保证效率的前提下,将算法从具体的应用中抽象出来而创建一个通用的算法库;

  • 使用泛型化编程可以最大限度地重用代码、保护类型的安全性及提高性能;

  • C {\rm C} C++支持泛型化编程是通过模板技术实现的,典型的是 S T L {\rm STL} STL

  • C {\rm C} C++标准库和 S T L {\rm STL} STL的主要内容如下:

    16

  • S T L {\rm STL} STL主要组件:

    • 容器 ( c o n t a i n e r s ) ({\rm containers}) (containers):容器是可容纳一些数据的模板类,可以将其看作一种数据结构, S T L {\rm STL} STL包含很多数据结构,如:链表 ( l i s t ) ({\rm list}) (list)、向量 ( v e c t o r ) ({\rm vector}) (vector)、队列 ( q u e u e ) ({\rm queue}) (queue)、堆栈 ( s t a c k ) ({\rm stack}) (stack)等, s t r i n g {\rm string} string类也可看作一个容器;
    • 算法 ( a l g o r i t h m s ) ({\rm algorithms}) (algorithms):包含了约 70 70 70个通用算法,用于操纵各种容器;
    • 迭代器 ( i t e r a t o r s ) ({\rm iterators}) (iterators):迭代器用于遍历 S T L {\rm STL} STL容器中的部分或全部元素,从而操作容器中的数据;
11.2 STL的使用
  • S T L {\rm STL} STL中,容器按照存储结构分为:顺序容器 ( s e q u e n c e   c o n t a i n e r ) ({\rm sequence\ container}) (sequence container)、关联容器 ( a s s o c i a t i v e   c o n t a i n e r ) ({\rm associative\ container}) (associative container)

    • 顺序容器:将其中的对象组织成一个有限线性的结构,所有对象都是相同类型的元素, S T L {\rm STL} STL中包含三种基本的顺序容器:线性表 ( l i s t ) ({\rm list}) (list)、向量 ( v e c t o r ) ({\rm vector}) (vector)、双向队列 ( d e q u e ) ({\rm deque}) (deque)
    • 关联容器:通过其内部处理机制来将进入其中的元素进行一定的排列,以使其具有数据的快速检索能力,一般情况下,这种快速检索是基于 k e y {\rm key} key值的,即一个 k e y {\rm key} key对应一个或多个元素; S T L {\rm STL} STL 4 4 4种关联容器:当一个 k e y {\rm key} key对应一个 v a l u e {\rm value} value时,使用集合 ( s e t ) ({\rm set}) (set)和映射 ( m a p ) ({\rm map}) (map),若同一 k e y {\rm key} key对应多个元素,使用多集合 ( m u l t i s e t ) ({\rm multiset}) (multiset)和多映射 ( m u l t i m a p ) ({\rm multimap}) (multimap);
  • S T L {\rm STL} STL容器及对应的头文件:

    数据结构 数据结构 数据结构 描述 描述 描述 头文件 头文件 头文件
    向量 ( v e c o t r ) 向量{\rm (vecotr)} 向量(vecotr) 连续存储的元素集合 , 类似一维动态数组 , 为顺序容器 连续存储的元素集合,类似一维动态数组,为顺序容器 连续存储的元素集合,类似一维动态数组,为顺序容器< v e c t o r > {\rm vector}> vector>
    列表 ( l i s t ) 列表({\rm list}) 列表(list) 双向链表 , 由结点组成 , 每个结点包含一个元素 双向链表,由结点组成,每个结点包含一个元素 双向链表,由结点组成,每个结点包含一个元素< l i s t {\rm list} list>
    双队列 ( d e q u e ) 双队列({\rm deque}) 双队列(deque) 连续存储一组指针 , 指针指向不同元素 , 本质为数组 , 支持下标操作 连续存储一组指针,指针指向不同元素,本质为数组,支持下标操作 连续存储一组指针,指针指向不同元素,本质为数组,支持下标操作< d e q u e {\rm deque} deque>
    集合 ( s e t ) 集合({\rm set}) 集合(set) 由结点组成的红黑树 , 每个结点包含一个元素 , 结点间以某种作用于 元素对的谓词排列 ; 任何两个不同元素不能拥有相同的次序 \begin{aligned}&由结点组成的红黑树,每个结点包含一个元素,结点间以某种作用于\\&元素对的谓词排列;任何两个不同元素不能拥有相同的次序\end{aligned} 由结点组成的红黑树,每个结点包含一个元素,结点间以某种作用于元素对的谓词排列;任何两个不同元素不能拥有相同的次序< s e t {\rm set} set>
    多重集合 ( m u l t i s e t ) 多重集合({\rm multiset}) 多重集合(multiset) 允许两个元素拥有相同次序的集合 允许两个元素拥有相同次序的集合 允许两个元素拥有相同次序的集合< s e t {\rm set} set>
    栈 ( s t a c k ) 栈({\rm stack}) (stack) 先进后出数据结构的实现 先进后出数据结构的实现 先进后出数据结构的实现< s t a c k {\rm stack} stack>
    队列 ( q u e u e ) 队列({\rm queue}) 队列(queue) 先进先出数据结构的实现 先进先出数据结构的实现 先进先出数据结构的实现< q u e u e {\rm queue} queue>
    优先队列 ( p r i o r i t y _ q u e u e ) 优先队列({\rm priority\_queue}) 优先队列(priority_queue) 元素的次序是由作用于所存储的值对上的某种谓词决定的一种队列 元素的次序是由作用于所存储的值对上的某种谓词决定的一种队列 元素的次序是由作用于所存储的值对上的某种谓词决定的一种队列< q u e u e {\rm queue} queue>
    映射 ( m a p ) 映射({\rm map}) 映射(map) 由 { 键 , 值 } 对组成的集合 , 以某种作用于键对上的谓词排列 由\{键,值\}对组成的集合,以某种作用于键对上的谓词排列 {,}对组成的集合,以某种作用于键对上的谓词排列< m a p {\rm map} map>
    多重映射 ( m u l t i m a p ) 多重映射({\rm multimap}) 多重映射(multimap) 允许键对有相同次序的映射 允许键对有相同次序的映射 允许键对有相同次序的映射< m a p {\rm map} map>
  • 声明容器语法格式:

    容器<存储类型> 实例名
    
  • 容器实例 1 1 1:随机产生一组数值,将其存储后输出 ( e x a m p l e 11 _ 1. c p p ) ({\rm example11\_1.cpp}) (example11_1.cpp)

    /**
     * 作者:罗思维
     * 时间:2024/03/28
     * 描述:随机产生一组数值,将其存储后输出。 
     */
    #include <iostream>
    #include <vector>
    #include <ctime>
    
    using namespace std;
    
    int main() {
    	vector<int> arrNum;				// 声明一个vector实例,其存储的元素为int; 
    	srand((unsigned) time(NULL));	// 初始化随机数发生器种子; 
    
    	for (unsigned int i = 0; i < 10; i++) {
    		arrNum.push_back(rand());	// 将随机数存入arrNum种,push_back()函数将元素加入vector尾部; 
    	}
    
    	for (unsigned int i = 0; i < arrNum.size(); i++) {	// 输出所有值; 
    		cout << arrNum[i] << " ";
    	}
    
    	cout << endl;
    	cout << "元素个数:" << arrNum.size() << endl;
    	cout << "第三个元素为:" << arrNum.at(2) << endl;	// 输出特定元素; 
    	arrNum.pop_back();									// 删除最后一个元素; 
    
    	for (unsigned int i = 0; i < arrNum.size(); i++) {	// 输出所有值; 
    		cout << arrNum[i] << " ";
    	}
    	cout << endl;
    
    	return 0;
    }
    
  • 容器实例 2 2 2:利用 S T L {\rm STL} STL l i s t {\rm list} list类对字符串进行操作 ( e x a m p l e 11 _ 2. c p p ) ({\rm example11\_2.cpp}) (example11_2.cpp)

    /**
     * 作者:罗思维
     * 时间:2024/03/28
     * 描述:利用STL的list类对字符串进行操作。 
     */
    #include <iostream>
    #include <list>
    
    using namespace std;
    
    int main() {
        // 声明list<string>模板类的一个实例;
    	list<string> myStrList;
    	
    	// 使用list的成员函数push_pack和push_front插入一个元素到list中; 
    	myStrList.push_back("C");
    	myStrList.push_back("C++");
    	myStrList.push_front("Python");
    	myStrList.push_front("Java");
    
    	cout << "myStrList.size() = " << myStrList.size() << endl;
    
    	return 0;
    }
    
  • 迭代器本质上是指针的泛化,通过迭代器可以以相同的方式处理不同的数据结构(容器), S T L {\rm STL} STL 5 5 5种迭代器:

    • 输入迭代器 ( i n p u t   i t e r a t o r ) ({\rm input\ iterator}) (input iterator):输入是指向迭代器种输入数据,这些数据来源于容器,输入迭代器可以读取容器中的数据,将数据传送给程序,不改变容器中元素的值;
    • 输出迭代器 ( o u p u t   i t e r a t o r ) ({\rm ouput\ iterator}) (ouput iterator):输出是指将信息从程序中传输给容器,输出迭代器对于容器来说是输入;
    • 正向迭代器 ( f o r w a r d   i t e r a t o r ) ({\rm forward\ iterator}) (forward iterator):亦称为向前迭代器,正向迭代器只使用 + + ++ ++操作符来遍历容器,因此它每次沿容器中的元素位置向前移动一个元素;
    • 双向迭代器 ( b i − d i r e c t i o n a l   i t e r a t o r ) ({\rm bi-directional\ iterator}) (bidirectional iterator):具有正向迭代器的所有特征,同时支持 − − -- 操作符,可以向后移动一个元素;
    • 随机访问迭代器 ( r a n d o m   a c c e s s   i t e r a t o r ) ({\rm random\ access\ iterator}) (random access iterator):具有双向迭代器的所有特性,同时支持随机访问和比较指针大小操作;
  • 迭代器的类被封装在命名空间 s t d {\rm std} std中,迭代器主要由头文件:< u t i l i t y {\rm utility} utility>、< i t e r a t o r {\rm iterator} iterator>、< m e m o r y {\rm memory} memory>组成;

    • < u t i l i t y {\rm utility} utility>包括 S T L {\rm STL} STL中几个常用模板的声明;
    • < i t e r a t o r {\rm iterator} iterator>中提供了迭代器使用的许多方法;
    • < m e m o r y {\rm memory} memory>负责为容器中的元素分配存储空间,同时为某些算法执行期间产生的临时对象提供机制;
  • 迭代器实例:利用迭代器操作向量 ( e x a m p l e 11 _ 3. c p p ) ({\rm example11\_3.cpp}) (example11_3.cpp)

    /**
     * 作者:罗思维
     * 时间:2024/03/28
     * 描述:利用迭代器操作向量。 
     */
    #include <iostream>
    #include <vector>
    #include <iterator>
    #include <ctime>
    
    using namespace std;
    
    int main() {
    	vector<int> arrNum;				// 声明一个vector实例,存储的元素为int型; 
    	srand((unsigned)time(NULL));	// 初始化随机数发生器种子; 
    
    	for (int i = 0; i < 10; i++) {
    		arrNum.push_back(rand());	// 将随机生成的数存入arrNum向量容器; 
    	}
    
    	// 声明向量容器的迭代器并指向容器的第一个元素; 
    	vector<int>::iterator ite_vec = arrNum.begin();
    
    	while (ite_vec != arrNum.end()) {	// 利用迭代器来输出容器中的元素值; 
    		cout << *ite_vec << " ";
    		ite_vec++;
    	}
    
    	return 0;
    }
    
  • S T L {\rm STL} STL提供一系列高效的通用算法, S T L {\rm STL} STL算法部分主要由头文件:< a l g o r i t h m {\rm algorithm} algorithm>、< n u m e r i c {\rm numeric} numeric>、< f u n c t i o n a l {\rm functional} functional>组成:

    • < a l g o r i t h m {\rm algorithm} algorithm>:由大量的模板函数组成,这些函数大部分都是独立的,常用到的功能涉及:比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等;
    • < n u m e r i c {\rm numeric} numeric>:包括几个在序列上面进行简单数学运算的模板函数;
    • < f u n c t i o n a l {\rm functional} functional>:定义了一些模板类,用于声明函数对象;
  • 算法实例:利用 S T L {\rm STL} STL l i s t {\rm list} list类对字符串进行操作 ( e x a m p l e 11 _ 4. c p p ) ({\rm example11\_4.cpp}) (example11_4.cpp)

    /**
     * 作者:罗思维
     * 时间:2024/03/28
     * 描述:利用STL的list类对字符串进行操作。 
     */
    #include <iostream>
    #include <string>
    #include <list>
    #include <algorithm>
    
    using namespace std;
    
    void PrintElement(string& str) {
    	cout << str << endl;
    }
    int main() {
    	// 声明list容器myStrList; 
    	list<string> myStrList;
    
    	myStrList.push_back("C");			// 在尾部插入; 
    	myStrList.push_back("C++");			
    	myStrList.push_front("Python");		// 在头部插入; 
    	myStrList.push_front("Java");
    
    	for_each(myStrList.begin(), myStrList.end(), PrintElement);
    
    	return 0;
    }
    
  • S T L {\rm STL} STL常用的算法:

    • b i n a r y _ s e a r c h {\rm binary\_search} binary_search:在有序序列中查找 v a l u e {\rm value} value,如果找到,返回 t r u e {\rm true} true,否则返回 f a l s e {\rm false} false
    • c o p y {\rm copy} copy:复制序列;
    • c o p y _ b a c k w a r d {\rm copy\_backward} copy_backward:按照元素顺序进行反向复制;
    • c o u n t {\rm count} count:利用等于操作符,把标志范围类的元素与输入的值进行比较,并返回相等元素的个数;
    • c o u n t _ i f {\rm count\_if} count_if:对于标志范围类的元素应用输入的操作符,返回结果为 t r u e {\rm true} true的次数;
    • e q u a l {\rm equal} equal:如果两个序列在范围内的元素都相等,则返回 t r u e {\rm true} true,否则返回 f a l s e {\rm false} false
    • f i l l {\rm fill} fill:赋予范围内的每个元素相同的输入值;
    • f i l l _ n {\rm fill\_n} fill_n:将输入的值赋予 b e g i n {\rm begin} begin b e g i n + n {\rm begin+n} begin+n范围内的元素;
    • f i n d {\rm find} find:利用底层元素的等于操作符,将范围内的元素与输入的值进行比较,当匹配时,结束搜索,返回该元素的一个输入迭代器;
    • f o r _ e a c h {\rm for\_each} for_each:依次对范围内的所有元素执行输入的函数;
    • m a x {\rm max} max:返回两个元素中较大的一个;
    • m a x _ e l e m e n t {\rm max\_element} max_element:返回一个 i t e r a t o r {\rm iterator} iterator,指出序列中的最大元素;
    • m i n {\rm min} min:两个元素中的较小值;
    • m i n _ e l e m e n t {\rm min\_element} min_element:返回一个 i t e r a t o r {\rm iterator} iterator,指出序列中的最小元素;
    • m e r g e {\rm merge} merge:合并两个有序序列,并存放到另外一个序列;
    • r e m o v e {\rm remove} remove:删除在范围内的所有指定的元素;
    • r e m o v e _ i f {\rm remove\_if} remove_if:删除所有范围内输入操作结果为 t r u e {\rm true} true的元素;
    • r e p l a c e {\rm replace} replace:将范围内的所有等于 o l d _ v a l u e {\rm old\_value} old_value的元素都用 n e w _ v a l u e {\rm new\_value} new_value替代;
    • r e p l a c e _ i f {\rm replace\_if} replace_if:将范围内的所有操作结果为 t r u e {\rm true} true的元素用新值替代;
    • r e v e r s e {\rm reverse} reverse:将范围内的元素重新按反序排列;
    • s e a r c h {\rm search} search:给出两个范围,返回一个 i t e r a t o r {\rm iterator} iterator,指向在范围内第一次出现子序列的位置;
    • s e a r c h _ n {\rm search\_n} search_n:在范围内查找 v a l u e {\rm value} value出现 n {\rm n} n次的子序列;
    • s o r t {\rm sort} sort:以升序重新排列范围内的元素;
    • s w a p {\rm swap} swap:交换存储在两个对象中的值;
    • t r a n s f o r m {\rm transform} transform:将输入的操作作用在范围内的每个元素上,并产生一个新的序列;

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

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

相关文章

实践笔记-harbor搭建(版本:2.9.0)

harbor搭建 1.下载安装包&#xff08;版本&#xff1a;2.9.0&#xff09;2.修改配置文件3.安装4.访问harbor5.可能用得上的命令: 环境&#xff1a;centos7 1.下载安装包&#xff08;版本&#xff1a;2.9.0&#xff09; 网盘资源&#xff1a;https://pan.baidu.com/s/1fcoJIa4x…

垃圾回收机制--GC 垃圾收集器--JVM调优-面试题

1.触发垃圾回收的条件 新生代 Eden区域满了&#xff0c;触发young gc (ygc)老年代区域满了&#xff0c;触发full gc (fgc)通过ygc后进入老年代的平均大小大于老年代的可用内存,触发full gc(fgc).程序中主动调用的System.gc()强制执行gc,是full gc&#xff0c;但是不必然执行。…

KUKA机器人调整示教器灵敏度(校屏)

KUKA机器人KRC4的示教器升级后&#xff0c;示教器屏幕由之前的电阻屏改为电容屏&#xff0c;不仅在外观上有所变化&#xff0c;屏幕校准的方法也有所不同。通过以下方法分别对新旧两款示教器进行屏幕校正&#xff0c;调整示教器屏幕灵敏度。 对新款示教器而言&#xff1a; 一…

热烈祝贺阿里云PolarDB登顶2024最新一期中国数据库流行榜

热烈祝贺阿里云PolarDB登顶2024最新一期中国数据库流行榜 墨天轮墨天轮国产数据库流行度排行PolarDB首度夺魁关于话题的讨论数据库流行度排行榜会影响你的数据库选型吗&#xff1f;对于 PolarDB 的本次登顶&#xff0c;你认为关键因素是什么&#xff1f;PolarDB“三层分离”新版…

LeetCode-331. 验证二叉树的前序序列化【栈 树 字符串 二叉树】

LeetCode-331. 验证二叉树的前序序列化【栈 树 字符串 二叉树】 题目描述&#xff1a;解题思路一&#xff1a;看提示主要是栈和树。这题其实不是二叉树的遍历题&#xff0c;而是检验二叉树基础知识的题&#xff0c;也许有些难想。第一种解法是&#xff1a;把有效的叶子节点使用…

【OceanBase实战之路】第3篇:多租户架构实现资源隔离

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 目录 一、什么是OceanBase的多租户二、兼容模式2.1 MySQL 模式2.2 Oracle 模式三、租户介绍3.1 系统租户3.2 用户租户3.3 Meta 租…

强化基础-Java-泛型基础

什么是泛型&#xff1f; 泛型其实就参数化类型&#xff0c;也就是说这个类型类似一个变量是可变的。 为什么会有泛型&#xff1f; 在没有泛型之前&#xff0c;java中是通过Object来实现泛型的功能。但是这样做有下面两个缺陷&#xff1a; 1 获取值的时候必须进行强转 2 没有…

计算机网络-TCP/IP 网络模型

TCP/IP网络模型各层的详细描述&#xff1a; 应用层&#xff1a;应用层为应用程序提供数据传输的服务&#xff0c;负责各种不同应用之间的协议。主要协议包括&#xff1a; HTTP&#xff1a;超文本传输协议&#xff0c;用于从web服务器传输超文本到本地浏览器的传送协议。FTP&…

Linux 设备树: 设备树节点与属性在 dtb 文件中的存储

前言 当前新版本的 Linux 内核 设备驱动框架&#xff0c;与设备树&#xff08;Device Tree&#xff09;结合密切&#xff0c;整体 设备树的设备驱动框架&#xff0c;比较的庞大&#xff0c;但又非常的经典。 一个个的 设备树解析函数&#xff0c;都是前人【智慧】的结晶&#…

微服务监控:确保分布式系统的可观察性与稳定性

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 目录 一、前言二、微服务监控的重要性三、关键监控指标四、常用监控工具五、最佳实践六、结论 一、前言 在当前的软件开发领域&a…

2.快速排序

快速排序 思想&#xff1a;双指针法&#xff08;左右指针法&#xff09; 时间复杂度&#xff1a;O(n log n)&#xff08;最理想的情况下&#xff09; 最坏的情况&#xff1a;输入的数组已经是有序的或者接近有序时 快速排序的性能会退化到O(n^2) 我们的快速排序其实就是让两…

Wezterm配置

Windows 的图形界面目前来说在有图形界面的系统中&#xff0c;表现最稳定 linux 的终端最方便 和 tui 程序也多 我建议winodws安装 wsl 既可以使用 linux的环境和可以使用windows的桌面 关键 neovide --wsl 的表现很棒 如果项目的历史提交很多而且&#xff0c;工程很大&#xf…

C++STLmap,set

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

吴恩达2022机器学习专项课程(一) 4.4 学习率

问题预览/关键词 学习率太小有什么影响&#xff1f;学习率太大有什么影响&#xff1f;如果成本函数达到局部最小值&#xff0c;使用梯度下降还能继续最小化吗&#xff1f;为什么学习率固定&#xff0c;而最小化成本函数的步幅却越来越缓&#xff1f;如何选择合适的学习率&…

前端学习<二>CSS基础——12-CSS3属性详解:动画详解

前言 本文主要内容&#xff1a; 过渡&#xff1a;transition 2D 转换 transform 3D 转换 transform 动画&#xff1a;animation 过渡&#xff1a;transition transition的中文含义是过渡。过渡是CSS3中具有颠覆性的一个特征&#xff0c;可以实现元素不同状态间的平滑过渡…

2024 MCM数学建模美赛2024年A题复盘,思路与经验分享:资源可用性与性别比例 | 性别比例变化是否对生态系统中的其他生物如寄生虫提供优势(五)

审题 第四问让我们探究性别比例变化是否对生态系统中的其他生物如寄生虫提供优势。这里我们可以把问题简化一下&#xff0c;只探究性别比例会不会对寄生虫提供优势。因为考虑太多生物&#xff0c;会使模型更复杂&#xff0c;我这个水平处理不了这么复杂的问题&#xff0c;是我…

宠物领养(源码+文档)

宠物领养管理系统&#xff08;小程序、ios、安卓都可部署&#xff09; 文件包含内容程序简要说明含有功能项目截图客户端主页举报页注册页领养详细发布寻宠/送养领养页 管理端送养管理用户管理科普管理签到管理 文件包含内容 1、搭建视频 2、流程图 3、开题报告 4、数据库 5、…

【javaWeb 第八篇】后端-Mybatis(万字详细学习)

Mybatis框架 前言MybatisMybatis入门配置SQL提示JDBC数据库连接池lombok Mybatis基础操作日志输出Mybatis的动态SQL 前言 这篇是作者学习数据持久层框架Mybatis的学习笔记&#xff0c;希望对大家有所帮助&#xff0c;希望大家能够与作者交流讨论 Mybatis Mybatis是一款优秀的…

书生·浦语大模型实战营之轻松玩转书生·浦语大模型趣味案例

书生浦语大模型实战营 为了帮助社区用户高效掌握和广泛应用大模型技术&#xff0c;我们重磅推出书生浦语大模型实战营系列活动&#xff0c;旨在为开发者们提供全面而系统的大模型技术学习课程。加入我们&#xff0c;一起深入大模型全流程&#xff0c;从零搭建 RAG、多模态和智…

23种设计模式之创建型模式 - 单例模式

文章目录 一、单例模式1.1单例模式定义1.2 单例模式的特点 二、实现单例模式的方式2.1 饿汉式2.2 懒汉式2.3 双重检查锁&#xff1a;2.4 静态内部类2.5 枚举实现&#xff08;防止反射攻击&#xff09;&#xff1a; 一、单例模式 1.1单例模式定义 单例模式确保系统中某个类只有…