首页 > 编程笔记

STL(标准模板库)是什么

标准模板库(Standard Tem plate Library,STL)是所有 C++ 编译器和操作系统平台都支持的一种模板库。STL 提供了大量的复用软件组织,能让 C++ 程序设计者快速而高效地进行开发。本文主要对 STL 的组成进行讲解。

STL组成

STL 是惠普实验室开发的一系列标准化组件的统称。它是由 Alexander Stepanov、M eng Lee 和 David R.M usser 在惠普实验室工作时开发出来的。在1994 年,STL 被纳入 C++ 标准,成为 C++ 库的重要组成部分。

STL 主要由六个部分组成:空间配置器(Allocator)、适配器(Adapters)、容器(Containers)、迭代器(Iterator)、仿函数(Functors)和算法(Algorithm)。

STL 的一个基本理念就是将数据和操作分离,数据由容器加以管理,操作则由可定制的算法完成,迭代器在两者之间充当“黏合剂”。

STL 的组件结构图如图1 所示。

图1  STL组件结构图

图1  STL组件结构图
图1 展示了 STL 各组件之间的关系,STL 中的每个组件都有其特定功能,组件之间又密切关联。下面分别对每个组件进行简单介绍。

1) 容器

容器是存储其他对象的对象,它存储的对象可以是自定义数据类型的对象,也可以是内置数据类型的对象。这些被存储的对象必须是同一种数据类型,它们归容器所有,称为容器的元素。

当容器失效时,容器中的元素也会失效。容器本身包含了处理这些数据的方法。STL中的容器共有 13 种,如表 1 所示。

表1  STL容器的分类关联容器
序列容器 关联容器 无序容器
vector set unordered_set (C++11)
list multiset unordered_ multiset(C++11)
deque map multiset_ map(C++11)
array(C++11) multimap unordered_ multimap(C++11)
forward_list(C++11)

2) 空间配置器

C++ 标准库采用了空间配置器实现对象内存空间的分配和归还,空间配置器是特殊的内存模型。例如,使用vector容器,存储数据的空间由空间配置器完成内存的分配和资源回收。

空间配置器本质上是对new delete运算符再次封装而成的类模板,对外提供可用的接口,实现内存资源的自动化管理。

3) 适配器

适配器主要指容器适配器。容器适配器也是一类容器,它除了能存储普通数据,还可以存储 list、vector、deque 等容器。

容器适配器采用特定的数据管理策略,能够使容器在操作数据时表现出另一种行为。例如,使用容器适配器stack封装一个vector<int>容器,使vector<int> 容器在处理数据时,表现出栈这种数据结构的特点(先进后出)。

STL提供了三个容器适配器:stack(栈)、queue(队列)和 priority_queue(优先队列)。适配器体现了 STL 设计的通用性,极大提高了编程效率。

4) 迭代器

迭代器是STL提供的用于操作容器中元素的类模板,STL 算法利用迭代器遍历容器中的元素,迭代器本身也提供了操作容器元素的方法,使容器元素访问更便捷。

迭代器将容器与算法联系起来,起到了“黏合剂”的作用,STL 提供的算法几乎都通过迭代器实现元素访问。

STL提供了输入迭代器、输出迭代器、正向迭代器、双向迭代器和随机访问迭代器五种类型的迭代器,使用迭代器访问容器元素更简单、易用,且代码更加紧凑、简洁。

5) 仿函数

我们知道仿函数,仿函数通过重载 () 运算符实现,使类具有函数一样的行为。

仿函数也称为函数对象,是 STL 很重要的组成部分,它使 STL 的应用更加灵活方便,增强了算法的通用性。

大多数 STL 算法可以使用一个仿函数作为参数,以达到某种数据操作的目的。例如,在排序算法中,可以使用仿函数 less 或 greater 作为参数,以实现数据从大到小或从小到大的排序。

6) 算法

算法是 STL 定义的一系列函数模板,是 STL 非常重要的一部分内容。算法可以对容器中的元素施加特定操作。

STL 算法不依赖于容器的实现细节,只要容器的迭代器符合算法要求,算法就可以通过迭代器处理容器中的元素。

优秀文章