【C++】模板的下一步,STL标准模板库的介绍

欢迎来到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_mapunordered_setarray 和 forward_list
  • 新算法,例如std::copy_ifstd::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::clampstd::for_each_n等。
  • 新容器适配器std::scoped_lock
  • std::optionalstd::variantstd::any等用于增强编码灵活性和错误处理能力的工具。
  • 并行算法版本,允许算法利用多核处理器的优势来加速操作。

🍀🍀C++20

C++20是一个重大更新,对STL作了显著扩展:

  • 引入了概念(Concepts),这是一种新的语言特性,用来指定模板类型参数必须满足的接口和语义约束。
  • 范围视图(Ranges),提供了一种新的方式来组合并处理序列。
  • 更多的并行算法支持。
  • std::span,一个表示数组视图的轻量级容器。
  • 协程支持,虽然不是STL的一部分,但与异步编程模式紧密相关。

🍀🍀C++23

(截至2023年的信息)
C++23预计将进一步增强C++语言和STL,包括提案如统一的函数调用语法、更多的并行算法支持等。但具体内容和扩展会随着最终标准的确定而明朗化。

四、STL的六大组件

STL涉及数据结构、算法、迭代器等多个方面。STL的目标是提供高效、易用、可复用的组件。具体来说,STL由六大主要组件构成: 

  1. 容器(Containers)
    容器是用于存储数据的类模板。根据数据组织方式的不同,STL容器分为以下几类:

    • 序列容器:保持元素顺序的容器,如vectordequelistvector支持快速随机访问;deque是双端队列,支持在头尾两端快速插入和删除;list提供了快速的任意位置插入和删除。
    • 关联容器:通过键来快速查找元素的容器,如setmultisetmapmultimapset是关键字的集合,不允许重复;map是关键字到值的映射;而multisetmultimap分别允许在集合中有重复的关键字和映射。
    • 无序关联容器:C++11新增了不保持元素顺序但提供快速访问的容器,如unordered_setunordered_mapunordered_multisetunordered_multimap。这些容器使用哈希表来实现。
  2. 算法(Algorithms)
    STL算法是一系列模板函数,用来对数据进行处理。算法的种类很多,且大多不直接改变容器的内容,而是通过迭代器操作元素。几个典型的算法例子包括:

    • 非修改性算法:如find (查找元素)和count (计数元素);
    • 修改性算法:如copy (复制元素)和replace (替换元素);
    • 排序与相关操作:如sort (排序)和binary_search (二分查找);
    • 数值算法:如accumulate (计算元素总和)和inner_product (计算内积)。
  3. 迭代器(Iterators)
    迭代器是用来顺序访问容器中元素的对象。根据支持的操作,迭代器可以分为几种类别:

    • 输入迭代器:只能读取序列中的元素;
    • 输出迭代器:只能写入序列中的元素;
    • 前向迭代器:支持读取和写入操作,并能向前移动;
    • 双向迭代器:除了前向迭代器的操作外,还可以向后移动;
    • 随机访问迭代器:支持所有迭代器操作,并能在序列中任意跳跃。
  4. 适配器(Adaptors)
    适配器是用来改变其他容器、迭代器或函数对象行为的组件,大致可以分为以下几类:

    • 容器适配器:如stackqueuepriority_queue,分别提供了堆栈、队列和优先队列的行为。
    • 迭代器适配器:如insert_iteratorstream_iterator,为迭代器提供了特殊的功能。
    • 函数适配器:如bindnot1,可以改变函数对象的调用方式。
  5. 函数对象(Function Objects)
    也称为仿函数,这是重载了函数调用操作符()的对象。STL中的函数对象常用于定义如何执行某些操作,例如定义如何比较两个对象。例如,可以写一个函数对象来定义自定义排序准则。

    常见的函数对象包括用于算法的比较函数,如std::lessstd::greater

  6. 分配器(Allocators)
    分配器是用来抽象内存模型和管理容器内存分配的对象。每个STL容器类型都接受另一个模板参数来指定它的分配器,默认情况下使用std::allocator。分配器使容器能够独立于具体内存模型管理内存分配。


🛎️感谢各位同伴的支持,本期C++就讲解到这啦,如果你觉得写的不错的话,可以给个一键三连,点赞,关注+收藏,若有不足,欢迎各位在评论区讨论。   

  • 20
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值