
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。核心价值是"代码复用+性能优化",让开发者无需重复实现基础数据结构和算法。
一、STL的发展历史
起源:由计算机科学家 Alexander Stepanov 于 20 世纪 80 年代末设计,最初并非 C++ 标准,后因实用性被广泛认可。
标准化:1998 年被正式纳入 C++ 标准(C++98),成为 C++ 语言的核心特性;后续 C++11/14/17 等标准对其进行了扩展(如新增 std::array、std::unordered_map 等容器)。
设计理念:基于"泛型编程"(模板技术),实现"数据结构与算法分离"------同一算法可适配不同数据结构,同一数据结构可搭配不同算法,灵活性极强。
二、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要阅读部分源代码,主要参考的就是这个版本。
三、STL的核心学习内容

1. 容器(Containers)
核心定位:STL 中存储数据的具体数据结构,是数据的"载体"。
分类与核心成员:
• 序列式容器:string(字符串)、vector(动态数组)、list(双向链表)、deque(双端队列)
• 关联式容器:map(键值对,键唯一)、set(集合,元素唯一)、multimap(键可重复的map)、multiset(元素可重复的set)
容器适配器基于这些基础容器实现,并非独立基础容器。
核心特点:模板化实现,自动管理内存,支持迭代器访问。
2. 算法(Algorithms)
核心定位:操作容器中数据的通用函数,与容器解耦,通过迭代器实现数据操作。
思维导图核心成员:find(线性查找)、swap(交换元素)、reverse(反转序列)、sort(排序)、merge(合并有序序列)。
扩展:还包含计数(count)、删除(remove)、二分查找(binary_search)等,均为模板函数,适配不同容器。
3. 迭代器(Iterators)
核心定位:容器与算法之间的"桥梁",模拟指针行为(不是指针) ,提供统一的元素访问接口。
思维导图核心成员:
• iterator:普通可读可写迭代器
• const_iterator:只读迭代器(不能修改容器元素)
• reverse_iterator:反向迭代器(从容器末尾向前遍历)
• const_reverse_iterator:只读反向迭代器
核心作用:让算法无需关心容器内部结构,只需通过迭代器即可遍历/操作元素。
4. 仿函数(Functors,也叫函数对象)
核心定位:重载operator()的类对象,行为类似函数,用于自定义算法的逻辑规则。
思维导图核心成员:greater(大于比较)、less(小于比较),是STL内置的仿函数。
核心用途:
• 作为算法的参数,比如sort中传入greater<int>()实现降序排序。
• 自定义仿函数可实现复杂的判断/运算逻辑(如结构体排序的自定义规则)。
5. 适配器(Adapters)
核心定位:对STL基础组件(容器、迭代器、仿函数)进行包装,改变其接口或功能的"包装器"。
思维导图核心成员:stack(栈,LIFO)、queue(队列,FIFO)、priority_queue(优先队列),均为容器适配器。
核心特点:不直接存储数据,而是复用deque/vector等基础容器的底层实现,仅对外提供特定的接口(如栈的push/pop/top)。
6. 空间配置器(Allocator)
核心定位:STL的"内存管家",负责为容器分配、释放内存,是容器的底层内存管理组件。
思维导图核心标识:allocator(STL默认的空间配置器)。
核心作用:
• 封装了内存分配的细节(如new/delete的调用),让容器无需关心内存申请/释放。
• 可自定义空间配置器,实现特殊的内存管理策略(如内存池),提升内存使用效率。
四、学习意义
STL是C++学习中必须要掌握的一部分,而且它为我们提供了很多好用的工具,不仅避免了我们在实现一些东西上重复的造轮子,而且大大提高我们代码的运行效率。在一些竞赛和比赛也是必须要使用的。