目录
编辑
什么是STL
STL的版本
STL的六大组件
如何学习STL
STL的优势
STL的缺陷
⭐什么是STL
⭐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的六大组件
STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器。
容器:
容器是用于存储数据的类模板。STL提供了多种不同类型的容器,每种容器都设计用于特定的使用场景,如vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种class template。
算法:
STL提供了一系列通用算法,这些算法可以作用于容器中的元素。这些算法大多是与容器类型无关的,包括排序、搜索、修改序列、数值运算等。从实现的角度来看,STL算法是一种function tempalte.
迭代器:扮演了容器与算法之间的胶合剂,共有五种类型,从实现角度来看,迭代器是一种将operator* , operator-> , operator++,operator–等指针相关操作予以重载的class template. 所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。
仿函数:行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了operator()的class 或者class template
适配器(配接器):适配器是特殊类型的容器,它们提供了不同的接口或行为,基于其他容器实现。
空间配置器:负责空间的配置与管理。从实现角度看,配置器是一个实现了动态空间配置、空间管理、空间释放的class tempalte.
STL六大组件的交互关系,容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略的变化,适配器可以修饰仿函数。
⭐如何学习STL
简单总结一下:学习STL的三个境界:能用,明理,能扩展 。
⭐STL的优势
-
高效性:
- STL的数据结构和算法经过精心设计和优化,以保证运行时的高效性。例如,
std::vector
在尾部添加元素通常是常数时间复杂度,而std::sort
算法实现了高效的快速排序算法。 - 这意味着,在执行时间和资源使用上,STL能够提供出色的性能,这对于需要高效处理大量数据的应用程序来说是非常重要的。
- STL的数据结构和算法经过精心设计和优化,以保证运行时的高效性。例如,
-
复用性:
- STL的组件是模板化的,这意味着它们可以用于不同的数据类型,而不需要为每种数据类型重新实现逻辑。
- 这种设计减少了重复代码,使得开发者能够重用现有的数据结构和算法,加快开发进程并减少错误。
-
泛型编程:
- 通过模板,STL支持泛型编程,允许开发者编写独立于特定数据类型的代码。这增加了代码的通用性和灵活性。
- 泛型编程还意味着,同一套代码可以适用于多种数据类型,从而提高了代码的复用性和可维护性。
-
大量的算法:
- STL提供了一系列的标准算法,如排序、搜索、变换等。这些算法可以直接应用于STL容器,极大地提高了开发效率。
- 这些算法的存在减少了开发者需要手动实现这些常见操作的需要,从而可以专注于解决更具体的问题。
⭐STL的缺陷
- STL库的更新太慢了。这个得严重吐槽,上一版靠谱是C++98,中间的C++03基本一些修订。C++11出 来已经相隔了13年,STL才进一步更新。
- STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的。
- STL极度的追求效率,导致内部比较复杂。比如类型萃取,迭代器萃取。
- STL的使用会有代码膨胀的问题,比如使用vector/vector/vector这样会生成多份代码,当然这是模板语法本身导致的
____________________
⭐感谢你的阅读,希望本文能够对你有所帮助。如果你喜欢我的内容,记得点赞关注收藏我的博客,我会继续分享更多的内容。⭐