· CSDN的uu们,大家好。这里是C++入门的第十五讲。
· 座右铭:前路坎坷,披荆斩棘,扶摇直上。
· 博客主页: @姬如祎
· 收录专栏:C++专题
目录
STL(standard template libaray: 标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
·原始版本
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可以分为六大组件,它们分别是:容器(Containers)、算法(Algorithms)、迭代器(Iterators)、函数对象(仿函数)(Function Objects)、适配器(Adapters)和分配器(Allocators)。下面我将详细介绍每个组件。
1. 容器(Containers):
- 容器是STL的核心,提供了多种数据结构,包括向量(vector)、链表(list)、双端队列(deque)、栈(stack)、队列(queue)、优先队列(priority_queue)、集合(set)、映射(map)、多重映射(multimap)、多重集合(multiset)等。每种容器都有自己的特点和适用场景,可以方便地存储和操作数据。
2. 算法(Algorithms):
- STL包含了大量通用算法,如排序、查找、遍历等,这些算法可以用于不同类型的容器。这使得开发者可以快速有效地操作和处理容器中的数据,无需自己实现这些常见的操作。
3. 迭代器(Iterators):
- 迭代器是STL中的一个关键概念,它允许开发者在容器中遍历数据,而不必关心底层数据结构的具体细节。STL提供了多种类型的迭代器,包括输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器,以支持不同的遍历需求。
4. 函数对象(Function Objects):
- 函数对象(或仿函数)是可调用对象,它们可以像函数一样被调用,通常用于STL算法中的自定义操作。STL提供了一些内置的函数对象,如比较函数对象和数学函数对象,同时也允许开发者定义自己的函数对象。
5. 适配器(Adapters):
- 适配器是用于将一个容器或迭代器转化成另一种容器或迭代器的工具。STL提供了很多适配器,如栈适配器、队列适配器、优先队列适配器等,它们基于已有的容器提供不同的接口和行为。
6. 分配器(Allocators):
- 分配器是用于控制内存分配和释放的组件,可以自定义内存管理策略。STL中的容器通常使用默认分配器,但你也可以使用自定义的分配器来满足特定需求,如内存池分配器。
STL的这六大组件共同构成了一个强大的编程工具集,使C++开发者能够更高效地进行数据处理和算法实现。这些组件的设计目标是提供通用性、可重用性和性能,从而使开发更为便捷。通过熟练掌握STL,你可以加速C++应用程序的开发并提高代码的可维护性。
C++标准模板库(STL)在C++编程中具有重要的地位,其重要性体现在以下几个方面:
1. 提高开发效率:STL提供了丰富的容器、算法和工具,这些工具大大减轻了开发者的工作负担。通过使用STL,开发者能够快速地实现各种数据结构和算法,而无需自行编写复杂的数据结构和算法代码。这节省了时间和精力,使开发过程更加高效。
2. 提高代码可维护性:STL的组件经过广泛测试和优化,它们具有高质量的实现,可以减少代码中的错误和漏洞。此外,STL的通用性和标准化接口使得代码更易于理解和维护,因为其他开发者也能够轻松理解和使用STL的组件。
3. 提高代码性能:STL的组件通常经过高度优化,可以提供高性能的数据结构和算法。在很多情况下,STL提供的实现比手工编写的实现更快更稳定,因为STL的实现考虑了各种底层细节和性能优化。
4. 跨平台和标准化:STL是C++标准的一部分,因此可以在各种C++编译器和平台上使用,而不需要担心不同编译器的差异。这种跨平台性使得STL成为一种可移植的解决方案。
5. 丰富的数据结构和算法:STL提供了多种容器和算法,涵盖了广泛的应用场景,从简单的数组到复杂的图算法。这使得开发者能够更轻松地解决各种编程问题,而不必从零开始编写特定数据结构或算法。
6. 高度扩展性:STL的组件可以与自定义数据结构和算法结合使用。开发者可以通过实现自定义容器、迭代器、函数对象和分配器来扩展STL,以满足特定需求。
您大可放心,这个交给我就好啦,接下来的部分,我首先会告诉您怎么使用这些STL容器,然后以较为简单的方式模拟实现。通过模拟实现的过程你将对C++的STL有更深层次的理解!
推荐书籍:《STL远吗剖析》
1. STL库的更新太慢了。这个得严重吐槽,上一版靠谱是C++98,中间的C++03基本一些修订。C++11出 来已经相隔了13年,STL才进一步更新。
2. STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的。 3. STL极度的追求效率,导致内部比较复杂。比如类型萃取,迭代器萃取。
4. STL的使用会有代码膨胀的问题,比如使用vector/vector/vector这样会生成多份代码,当然这是模板语 法本身导致的。