C++ 标准模板库 (STL)- 学习推荐
STL 最初由 Alexander Stepanov 设计,后来在 C++ 98 中被接受为 C++ 标准的一部分。它是一个通用库,因此我们可以将它用于几乎所有数据类型,而无需重复实现代码。
推荐参考:C++ Standard Template Library (STL) - GeeksforGeeks
STL 的组件
STL的组件是C++中的标准模板库(STL)提供的功能,可分为4种类型:
- 容器
- 算法
- 迭代器
- 函子
这些组件设计得高效、灵活、可重用,使其成为现代 C++ 编程不可或缺的一部分。
容器
容器是根据需要用于存储对象和数据的数据结构。每个容器都作为模板类实现,还包含对其执行基本操作的方法。每个 STL 容器都在其自己的头文件中定义。
容器可进一步分为 4 种类型:
- 序列容器
- 容器适配器
- 关联容器
- 无序关联容器
如果您想深入研究 STL 并了解其全部潜力,我们的完整 C++ 课程提供了掌握 STL 提供的容器、迭代器和算法的完整指南。
序列容器
序列容器以线性方式存储数据。它们还用于实现容器适配器。C
++ STL 中有 5 种序列容器:
- 数组:STL 数组是编译时不可调整大小的数组的实现。它包含各种常见数组操作的方法。
- 向量:STL 向量可以定义为动态大小数组,当添加或删除新元素时可以自动调整大小。
- 双端队列:双端队列或双端队列是具有两端扩展和收缩功能的序列容器。这意味着我们可以在两端添加和删除数据。
- 列表:与向量不同,列表容器将数据存储在非连续内存中,并且仅提供对存储数据的顺序访问。它基本上实现了双向链表。
- 前向列表:前向列表也像列表一样以顺序方式存储数据,但不同之处在于前向列表仅存储序列中下一个元素的位置。它实现了单链表。
容器适配器
容器适配器是 STL 容器的一种,它可以调整现有的容器类以满足特定的需求或要求。C
++ STL 中有 3 个容器适配器:
- 堆栈: STL 堆栈遵循元素插入和删除的后进先出 (LIFO) 原则。此外,这些操作仅在堆栈的一端执行。
- 队列: STL 队列遵循先进先出 (FIFO) 原则,即先插入的元素先被移除,最后插入的元素最后被移除。它默认使用双端队列容器。
- 优先级队列: STL 优先级队列不遵循任何 FIFO 或 LIFO 原则,但元素的删除是根据其优先级进行的。因此,默认情况下,优先级最高的元素总是首先被删除。默认情况下,它使用向量作为底层容器。
关联容器
关联容器是一种根据键而不是插入顺序按排序顺序存储元素的容器。C
++ STL 中有 4 种关联容器:
- 集合:STL 集合是一种关联容器,其中每个元素必须是唯一的,因为元素的值可以标识它。默认情况下,值按升序存储。
- Maps:STL Maps 是关联容器,以键值对的形式存储元素。键必须是唯一的,容器根据键的值进行排序。
- Multisets:STL Multiset 与集合容器类似,只是它可以存储重复的值。
- Multimaps:STL Multimap 类似于地图容器,但允许多个映射值具有相同的键。
无序关联容器
无序关联容器以无特定顺序存储数据,但它们允许在 STL 中的所有容器类型中执行最快的插入、删除和搜索操作。C
++ STL 中有 4 种无序关联容器:
- 无序集:STL 无序集以哈希表的形式存储唯一键。顺序是随机的,但插入、删除和搜索都很快。
- 无序多集:STL 无序多集的工作方式与无序集类似,但可以存储同一键的多个副本。
- 无序映射:STL 无序映射将键值对存储在哈希表中,其中对键进行哈希处理以找到存储位置。
- 无序多映射: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 种类型:
- 输入迭代器:输入迭代器可用于从序列中读取一次值并且仅向前移动。
- 输出迭代器:输出迭代器可用于将值写入序列一次并且仅向前移动。
- 前向迭代器:前向迭代器结合了输入和输出迭代器的特点。
- 双向迭代器:双向迭代器支持前向迭代器的所有操作,另外还可以向后移动。
- 随机访问迭代器:随机访问迭代器支持双向迭代器的所有操作,并提供对元素的有效随机访问。
函子
函子是可以当作函数来处理的对象。函子最常与 STL 算法一起使用。它重载 函数调用运算符,并允许我们像使用函数一样使用对象。C++ STL 中有许多预定义的函子,它们在< functional >头文件 中定义。 ()
根据函子执行的运算符类型,函子可以分为多种类型:
- 算术函子
- 关系函子
- 逻辑函子
- 按位函数
算术函子
- 加法 –返回两个参数的总和。
- 减号 –返回两个参数的差值。
- 乘法——返回两个参数的乘积。
- 除法 –返回两个参数相除后的结果。
- 模数 –返回两个参数相除后的余数。
- 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、智能指针等。
- Pair:用于存储和操作异构数据的容器。
- 移动语义:它允许将资源从一个对象转移到另一个对象而无需复制。
- 智能指针:它们是原始指针的包装器,有助于避免与指针相关的错误。
- 实用函数:C++ 中的实用函数提供诸如 std::forward 之类的重要操作,以促进高效、通用和安全的代码操作。
- 整数序列:启用编译时生成整数序列,在元编程中很有用。
C++ 标准模板库 (STL) 的优点
STL 的主要优势在于,它提供了一种编写通用、可重复使用的代码和经过测试的代码的方法,这些代码可以应用于不同的数据类型。这意味着您可以编写一次算法,然后将其用于其他类型的数据,而无需为每种类型编写单独的代码。
其他优势包括:
- STL 通过可定制的模板、函子和 lambda 提供灵活性。
- 预先实现的工具让您专注于解决问题而不是低级编码。
- STL 处理内存管理,从而减少内存泄漏等常见错误。
C++ 标准模板库 (STL) 的局限性
C++ 标准模板库 (STL) 的主要限制是性能开销。虽然 STL 针对一般用例进行了高度优化,但与定制和专用解决方案相比,其通用性质可能导致内存使用效率较低且执行时间较短。
其他限制包括:
- 调试的复杂性。
- 缺乏对内存管理的控制。
- 对并发编程的支持有限。
- 自定义数据结构集成的灵活性有限。
尽管存在这些限制,STL 仍然是 C++ 编程中不可或缺的一部分,提供了各种强大而灵活的工具。
在无干扰的环境中学习,通过精致、高质量的内容和35 多个专家指导的技术课程,帮助您应对任何面试。从编程语言和 DSA 到 Web 开发和数据科学,GeeksforGeeks Premium都能满足您的需求!立即
选择GeeksforGeeks Premium,还可以访问无限文章摘要、100% 无广告环境、所有编码问题中的 AI 机器人支持等等。升级为 Premium!