欢迎来到CILMY23的博客
🏆本篇主题为:模板的新玩法,STL标准模板库的介绍
🏆个人主页:CILMY23-CSDN博客
🏆系列专栏:Python | C++ | C语言 | 数据结构与算法 | 贪心算法 | Linux
🏆感谢观看,支持的可以给个一键三连,点赞关注+收藏。
✨写在前头:
在学习完模板后,我们也是会了不少泛式编程,我们知道了template<typename T>是用来通用的创建模板,比起C语言的void*也是更为广泛使用,接下来我们将了解模板库,深入浅出C++ STL,迈出我们的第一步
一、什么是STL
STL是C++,Standard Template Library(标准模板库)的缩写。是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。提供了一组模板化的常见数据结构和算法,并且由于其模板本质,能够以类型无关的方式处理数据。
什么是C++标准库?
C++标准库是C++语言的一个核心部分,它为程序员提供了一系列预定义的类和函数。这些类和函数用于实现常见的程序任务,如输入/输出处理(I/O)、字符串操作、数学计算、时间/日期处理、数据结构和算法等。C++标准库是经过精心设计、经过严格测试的,且具有高度可移植性的,它覆盖了从底层语言特性到高级抽象的几乎所有方面。
二、STL的几个版本
- 🍀 原始版本
Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意 运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本--所有STL实现版本的始祖。
- 🍀P. J. 版本
由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低, 符号命名比较怪异。
- 🍀RW版本
由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般。
- 🍀SGI版本
由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版本。被GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程风格上看,阅读性非常高。
三、STL随C++语言的发展
C++标准的主要版本相关联的STL的一些关键改进概览。
🍀🍀C++98与C++03
C++98是STL被正式纳入C++标准的版本。在这个版本中,STL包含了基本的容器、算法、迭代器、函数对象等。C++03是对C++98的一次微小修订,主要是对标准的清晰化和错误修正,没有对STL功能作出显著修改。
🍀🍀C++11
C++11是C++的一次重大更新,它为STL带来了许多重要的改进和扩展:
- 新容器:
unordered_map
、unordered_set
、array
和forward_list
。 - 新算法,例如
std::copy_if
和std::find_if_not
等。 - 支持 lambda 表达式,这使得使用STL算法时可以写出更清晰、更简洁的代码。
std::function
和std::bind
,为函数对象提供了更灵活的使用方式。- 线程库(虽然严格来说不属于STL,但与并发编程的STL风格集成关系密切)。
🍀🍀C++14
C++14是对C++11的增强,增加了泛型 lambda 表达式和其他一些语言特性的小幅度改进。对STL的直接影响相对较小,主要是对现有特性的改善和一些新实用程序的添加。
🍀🍀C++17
C++17进一步扩充了STL,引入了:
- 新算法,如
std::clamp
、std::for_each_n
等。 - 新容器适配器
std::scoped_lock
。 std::optional
、std::variant
和std::any
等用于增强编码灵活性和错误处理能力的工具。- 并行算法版本,允许算法利用多核处理器的优势来加速操作。
🍀🍀C++20
C++20是一个重大更新,对STL作了显著扩展:
- 引入了概念(Concepts),这是一种新的语言特性,用来指定模板类型参数必须满足的接口和语义约束。
- 范围视图(Ranges),提供了一种新的方式来组合并处理序列。
- 更多的并行算法支持。
std::span
,一个表示数组视图的轻量级容器。- 协程支持,虽然不是STL的一部分,但与异步编程模式紧密相关。
🍀🍀C++23
(截至2023年的信息)
C++23预计将进一步增强C++语言和STL,包括提案如统一的函数调用语法、更多的并行算法支持等。但具体内容和扩展会随着最终标准的确定而明朗化。
四、STL的六大组件
STL涉及数据结构、算法、迭代器等多个方面。STL的目标是提供高效、易用、可复用的组件。具体来说,STL由六大主要组件构成:
-
容器(Containers):
容器是用于存储数据的类模板。根据数据组织方式的不同,STL容器分为以下几类:- 序列容器:保持元素顺序的容器,如
vector
、deque
、list
。vector
支持快速随机访问;deque
是双端队列,支持在头尾两端快速插入和删除;list
提供了快速的任意位置插入和删除。 - 关联容器:通过键来快速查找元素的容器,如
set
、multiset
、map
、multimap
。set
是关键字的集合,不允许重复;map
是关键字到值的映射;而multiset
和multimap
分别允许在集合中有重复的关键字和映射。 - 无序关联容器:C++11新增了不保持元素顺序但提供快速访问的容器,如
unordered_set
、unordered_map
、unordered_multiset
、unordered_multimap
。这些容器使用哈希表来实现。
- 序列容器:保持元素顺序的容器,如
-
算法(Algorithms):
STL算法是一系列模板函数,用来对数据进行处理。算法的种类很多,且大多不直接改变容器的内容,而是通过迭代器操作元素。几个典型的算法例子包括:- 非修改性算法:如
find
(查找元素)和count
(计数元素); - 修改性算法:如
copy
(复制元素)和replace
(替换元素); - 排序与相关操作:如
sort
(排序)和binary_search
(二分查找); - 数值算法:如
accumulate
(计算元素总和)和inner_product
(计算内积)。
- 非修改性算法:如
-
迭代器(Iterators):
迭代器是用来顺序访问容器中元素的对象。根据支持的操作,迭代器可以分为几种类别:- 输入迭代器:只能读取序列中的元素;
- 输出迭代器:只能写入序列中的元素;
- 前向迭代器:支持读取和写入操作,并能向前移动;
- 双向迭代器:除了前向迭代器的操作外,还可以向后移动;
- 随机访问迭代器:支持所有迭代器操作,并能在序列中任意跳跃。
-
适配器(Adaptors):
适配器是用来改变其他容器、迭代器或函数对象行为的组件,大致可以分为以下几类:- 容器适配器:如
stack
、queue
和priority_queue
,分别提供了堆栈、队列和优先队列的行为。 - 迭代器适配器:如
insert_iterator
、stream_iterator
,为迭代器提供了特殊的功能。 - 函数适配器:如
bind
和not1
,可以改变函数对象的调用方式。
- 容器适配器:如
-
函数对象(Function Objects):
也称为仿函数,这是重载了函数调用操作符()
的对象。STL中的函数对象常用于定义如何执行某些操作,例如定义如何比较两个对象。例如,可以写一个函数对象来定义自定义排序准则。常见的函数对象包括用于算法的比较函数,如
std::less
和std::greater
。 -
分配器(Allocators):
分配器是用来抽象内存模型和管理容器内存分配的对象。每个STL容器类型都接受另一个模板参数来指定它的分配器,默认情况下使用std::allocator
。分配器使容器能够独立于具体内存模型管理内存分配。
🛎️感谢各位同伴的支持,本期C++就讲解到这啦,如果你觉得写的不错的话,可以给个一键三连,点赞,关注+收藏,若有不足,欢迎各位在评论区讨论。