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

C++ 标准模板库 (STL)- 学习推荐

C++ 标准模板库 (STL) 是一组模板类和函数,提供常见数据结构和算法(如列表、堆栈、数组、排序、搜索等)的实现。它还提供迭代器和函子,使得使用算法和容器变得更加容易。

STL 最初由 Alexander Stepanov 设计,后来在 C++ 98 中被接受为 C++ 标准的一部分。它是一个通用库,因此我们可以将它用于几乎所有数据类型,而无需重复实现代码。

推荐参考:C++ Standard Template Library (STL) - GeeksforGeeks

STL 的组件

STL的组件是C++中的标准模板库(STL)提供的功能,可分为4种类型:

  1. 容器
  2. 算法
  3. 迭代器
  4. 函子

这些组件设计得高效、灵活、可重用,使其成为现代 C++ 编程不可或缺的一部分。

容器

容器是根据需要用于存储对象和数据的数据结构。每个容器都作为模板类实现,还包含对其执行基本操作的方法。每个 STL 容器都在其自己的头文件中定义。

容器可进一步分为 4 种类型:

  1. 序列容器
  2. 容器适配器
  3. 关联容器
  4. 无序关联容器

如果您想深入研究 STL 并了解其全部潜力,我们的完整 C++ 课程提供了掌握 STL 提供的容器、迭代器和算法的完整指南。

序列容器

序列容器以线性方式存储数据。它们还用于实现容器适配器。C
++ STL 中有 5 种序列容器:

  1. 数组:STL 数组是编译时不可调整大小的数组的实现。它包含各种常见数组操作的方法。
  2. 向量:STL 向量可以定义为动态大小数组,当添加或删除新元素时可以自动调整大小。
  3. 双端队列:双端队列或双端队列是具有两端扩展和收缩功能的序列容器。这意味着我们可以在两端添加和删除数据。
  4. 列表:与向量不同,列表容器将数据存储在非连续内存中,并且仅提供对存储数据的顺序访问。它基本上实现了双向链表。
  5. 前向列表前向列表也像列表一样以顺序方式存储数据,但不同之处在于前向列表仅存储序列中下一个元素的位置。它实现了单链表。

容器适配器

容器适配器是 STL 容器的一种,它可以调整现有的容器类以满足特定的需求或要求。C
++ STL 中有 3 个容器适配器:

  1. 堆栈 STL 堆栈遵循元素插入和删除的后进先出 (LIFO) 原则。此外,这些操作仅在堆栈的一端执行。
  2. 队列 STL 队列遵循先进先出 (FIFO) 原则,即先插入的元素先被移除,最后插入的元素最后被移除。它默认使用双端队列容器。
  3. 优先级队列 STL 优先级队列不遵循任何 FIFO 或 LIFO 原则,但元素的删除是根据其优先级进行的。因此,默认情况下,优先级最高的元素总是首先被删除。默认情况下,它使用向量作为底层容器。

关联容器

关联容器是一种根据键而不是插入顺序按排序顺序存储元素的容器。C
++ STL 中有 4 种关联容器:

  1. 集合:STL 集合是一种关联容器,其中每个元素必须是唯一的,因为元素的值可以标识它。默认情况下,值按升序存储。
  2. Maps:STL Maps 是关联容器,以键值对的形式存储元素。键必须是唯一的,容器根据键的值进行排序。
  3. Multisets:STL Multiset 与集合容器类似,只是它可以存储重复的值。
  4. Multimaps:STL Multimap 类似于地图容器,但允许多个映射值具有相同的键。

无序关联容器

无序关联容器以无特定顺序存储数据,但它们允许在 STL 中的所有容器类型中执行最快的插入、删除和搜索操作。C
++ STL 中有 4 种无序关联容器:

  1. 无序集:STL 无序集以哈希表的形式存储唯一键。顺序是随机的,但插入、删除和搜索都很快。
  2. 无序多集:STL 无序多集的工作方式与无序集类似,但可以存储同一键的多个副本。
  3. 无序映射:STL 无序映射将键值对存储在哈希表中,其中对键进行哈希处理以找到存储位置。
  4. 无序多映射:STL 无序多映射容器与无序映射类似,但它允许多个值映射到同一个键。

算法

STL 算法提供了广泛的函数来对数据(主要是容器)执行常见操作。这些函数实现了算法的最高效版本,可用于对容器中的数据进行排序、搜索、修改和操作等任务。所有 STL 算法均在<algorithm><numeric>头文件中定义。STL
算法没有正式的分类,但我们可以根据它们执行的操作类型将它们分为两类:

操控算法

操作算法执行修改给定容器的元素或重新排列其顺序的操作。
一些常见的操作算法包括:

  • copy:将特定数量的元素从一个范围复制到另一个范围。
  • fill:为一定范围内的所有元素分配指定的值。
  • transform:将函数应用于一个范围中的每个元素,并将结果存储在另一个范围中。
  • replace:用新值替换范围内出现的所有特定值。
  • swap:交换两个变量的值。
  • reverse:反转范围内元素的顺序。
  • rotate:旋转一定范围内的元素,使得特定元素成为第一个。
  • remove:从范围内删除具有指定值的所有元素,但不减小容器大小。
  • unique:从某个范围内删除连续重复的元素。

非操纵算法

非操作算法是标准模板库 (STL) 提供的一种算法,它对一定范围内的元素进行操作,而不会改变元素的值或元素的顺序。
以下是 STL 非操作算法的几个示例:

  • max_element:查找给定范围内的最大元素。
  • min_element :查找给定范围内的最小元素。
  • 累积:求出给定范围的元素之和。
  • count:计算范围内给定元素的出现次数。
  • find:返回指向范围内某个元素第一次出现的迭代器。
  • is_permutation:检查一个范围是否是另一个范围的排列。
  • is_sorted:检查范围内的元素是否按非降序排序。
  • partial_sum:计算一定范围内元素的累积和。

迭代器

迭代器是用于指向 STL 容器内存地址的指针类对象。它们是将 STL 算法与容器连接起来的最重要组件之一。迭代器在<iterator>头文件中定义。

在 C++ STL 中,迭代器有 5 种类型:

  1. 输入迭代器:输入迭代器可用于从序列中读取一次值并且仅向前移动。
  2. 输出迭代器:输出迭代器可用于将值写入序列一次并且仅向前移动。
  3. 前向迭代器:前向迭代器结合了输入和输出迭代器的特点。
  4. 双向迭代器:双向迭代器支持前向迭代器的所有操作,另外还可以向后移动。
  5. 随机访问迭代器:随机访问迭代器支持双向迭代器的所有操作,并提供对元素的有效随机访问。

函子

函子是可以当作函数来处理的对象。函子最常与 STL 算法一起使用。它重载 函数调用运算符,并允许我们像使用函数一样使用对象。C++ STL 中有许多预定义的函子,它们在< functional >头文件 中定义。 ()

根据函子执行的运算符类型,函子可以分为多种类型:

  1. 算术函子
  2. 关系函子
  3. 逻辑函子
  4. 按位函数

算术函子

  • 加法 –返回两个参数的总和。
  • 减号 –返回两个参数的差值。
  • 乘法——返回两个参数的乘积。
  • 除法 –返回两个参数相除后的结果。
  • 模数 –返回两个参数相除后的余数。
  • negate –返回参数的取反值。

关系函子

  • equal_to – 如果两个参数相等,则返回 true。
  • not_equal_to – 如果两个参数不相等,则返回 true。
  • greater – 如果第一个参数大于第二个参数,则返回 true。
  • greater_equal – 如果第一个参数大于或等于第二个参数,则返回 true。
  • less – 如果第一个参数小于第二个参数,则返回 true。
  • less_equal – 如果第一个参数小于或等于第二个参数,则返回 true。

逻辑函子

  • logical_and – 返回两个参数的逻辑与运算的结果。
  • logical_or – 返回两个参数的逻辑或运算的结果。
  • logical_not – 返回参数逻辑非运算的结果。

按位函数

  • bit_and – 返回两个参数按位与运算的结果。
  • bit_or –返回两个参数按位或运算的结果。
  • bit_xor –返回两个参数的按位异或运算的结果。

实用程序和内存库

实用程序库是标准模板库 (STL) 提供的实用程序组件的集合,不属于上述类别。它提供各种功能,例如对、元组等。

内存库包含帮助用户有效管理内存的函数,例如 std::move、智能指针等。

  1. Pair:用于存储和操作异构数据的容器。
  2. 移动语义:它允许将资源从一个对象转移到另一个对象而无需复制。
  3. 智能指针:它们是原始指针的包装器,有助于避免与指针相关的错误。
  4. 实用函数:C++ 中的实用函数提供诸如 std::forward 之类的重要操作,以促进高效、通用和安全的代码操作。
  5. 整数序列:启用编译时生成整数序列,在元编程中很有用。

C++ 标准模板库 (STL) 的优点

STL 的主要优势在于,它提供了一种编写通用、可重复使用的代码和经过测试的代码的方法,这些代码可以应用于不同的数据类型。这意味着您可以编写一次算法,然后将其用于其他类型的数据,而无需为每种类型编写单独的代码。
其他优势包括:

  • STL 通过可定制的模板、函子和 lambda 提供灵活性。
  • 预先实现的工具让您专注于解决问题而不是低级编码。
  • STL 处理内存管理,从而减少内存泄漏等常见错误。

C++ 标准模板库 (STL) 的局限性

C++ 标准模板库 (STL) 的主要限制是性能开销。虽然 STL 针对一般用例进行了高度优化,但与定制和专用解决方案相比,其通用性质可能导致内存使用效率较低且执行时间较短。
其他限制包括:

  • 调试的复杂性。
  • 缺乏对内存管理的控制。
  • 对并发编程的支持有限
  • 自定义数据结构集成的灵活性有限。

尽管存在这些限制,STL 仍然是 C++ 编程中不可或缺的一部分,提供了各种强大而灵活的工具。

 

在无干扰的环境中学习,通过精致、高质量的内容35 多个专家指导的技术课程,帮助您应对任何面试。从编程语言和 DSA 到 Web 开发和数据科学,GeeksforGeeks Premium都能满足您的需求!立即

选择GeeksforGeeks Premium,还可以访问无限文章摘要、100% 无广告环境、所有编码问题中的 AI 机器人支持等等。升级为 Premium!

 
 
下一篇文章
C++ STL(标准模板库)中的容器

类似读物

C++ 标准模板库 (STL) 中的二分查找
二分查找是一种广泛使用的搜索算法,要求在搜索之前对数组进行排序。该算法背后的主要思想是不断将数组分成两半(分而治之),直到找到元素,或者所有元素都用尽。它的工作原理是将数组的中间项与我们的目标进行比较,如果匹配
阅读时间:3分钟
C++ 标准模板库 (STL) 中的 Multimap
Multimap 类似于 map,但多个元素可以具有相同的键。此外,在这种情况下,键值对和映射值对不必是唯一的。关于 multimap 需要注意的一件重要事情是,multimap 始终按排序顺序保存所有键。multimap 的这些属性使其在 .NET Framework 中非常有用。
阅读时间:6 分钟
C++ 标准模板库 (STL) 中的 Deque
双端队列是具有两端扩展和收缩功能的序列容器。它们类似于向量,但在插入和删除元素时效率更高。与向量不同,可能无法保证连续的存储分配。双端队列基本上是数据结构 doub 的实现
阅读时间:4分钟
C++ STL(标准模板库)中的容器
容器是存储其他对象(其元素)集合的持有者对象。它们以类模板的形式实现,这为支持作为元素的类型提供了极大的灵活性。容器管理其元素的存储空间,并提供成员函数来直接或通过迭代器访问它们(参考 ob
2分钟阅读
在 C++ 标准模板库 (STL) 中排序
排序是应用于数据的最基本函数之一。它意味着以特定方式排列数据,可以是增加或减少。C++ STL 中有一个名为 sort() 的内置函数。此函数内部使用 IntroSort。更详细地说,它是使用 QuickSort、HeapSort 和 InsertionSort 的混合来实现的。
阅读时间:6 分钟
C++ 标准模板库 (STL) 中的多重集
多集是一种与集合类似的关联容器,不同之处在于多个元素可以具有相同的值。与多集相关的一些基本函数:begin() - 返回指向多集中第一个元素的迭代器 --> O(1)end() - 返回指向多集中最后一个元素之后的理论元素的迭代器
阅读时间:6 分钟
C++ 标准模板库 (STL) 中的 Map
映射是关联容器,以映射方式存储元素。每个元素都有一个键值和一个映射值。任​​何两个映射值都不能具有相同的键值。std::map 是映射容器的类模板,它在 <map> 头文件中定义。基本 std::map 成员函数与 std:: 相关的一些基本函数:
阅读时间:9 分钟
在 C++ 标准模板库 (STL) 中设置
集合是一种关联容器,其中每个元素必须是唯一的,因为元素的值可以标识它。值以特定的排序顺序存储,即升序或降序。std::set 类是 C++ 标准模板库 (STL) 的一部分,它在 <set> 头文件中定义。语法:std:
阅读时间:7 分钟
C++ 标准模板库 (STL) 中的优先级队列
C++ 优先级队列是一种容器适配器,专门设计为队列的第一个元素是队列中所有元素中最大或最小的元素,并且元素按非递增或非递减顺序排列(因此我们可以看到队列的每个元素都有优先级{固定顺序})。在 C++ STL 中,顶部元素
阅读时间:11 分钟
C++ 标准模板库 (STL) 中的队列
队列是一种容器适配器,以先进先出 (FIFO) 的方式运行。元素插入到后端(末尾),从前端删除。队列使用双端队列或列表(顺序容器类)的封装对象作为其底层容器,提供一组特定的成员函数来访问其元素
阅读时间:4分钟   ​​​​​​​ ​​​​​​​  

http://www.mrgr.cn/news/67764.html

相关文章:

  • C语言 | Leetcode C语言题解之第538题把二叉搜索树转换为累加树
  • 利用亚马逊AWS IoT核心和MQTT进行数据采集的综合指南
  • 纯蒸汽质量检测验证:不可忽视的细节与要点
  • 从0开始搭建一个生产级SpringBoot2.0.X项目(十二)SpringBoot接口SpringSecurity JWT鉴权
  • SCRM开发新趋势打造高效客户关系管理系统
  • 1.6K+ Star!Ichigo:一个开源的实时语音AI项目
  • 火语言RPA流程组件介绍--指纹浏览器管理
  • 2024 软件著作权申请详细操作过程
  • 如何下载无水印的TikTok视频
  • 【LeetCode】返回链表的中间结点、删除链表的倒数第 N 个结点
  • Redis集群——针对实习面试
  • Footprint Analytics 助力 Sei 游戏生态增长
  • 力扣11.7
  • 双指针算法篇——一快一慢须臾之间解决问题的飘逸与灵动(3)
  • 论文撤稿后版面费能退吗?
  • qt QFileSystemModel详解
  • Nature重磅:AI化学家再升级!大幅提升实验效率,推动化学合成进入“智能化”新阶段
  • 天命人开店日记之门店经营调研(下)
  • 常见软件架构分析
  • MySQL表的增删改查(CRUD1)
  • ls和ll命令的差别如何查看隐藏文件
  • Linux(CentOS)开放端口
  • MongoDB笔记02-MongoDB基本常用命令
  • mybatis插入数据运行成功但数据库没有数据,id却在增长,是什么原因??
  • Android 项目模型配置管理
  • qt5将程序打包并使用