• 【C++ 学习 ⑧】- STL 简介


    目录

    一、什么是 STL?

    二、STL 的版本

    三、STL 的 6 大组件和 13 个头文件

    四、学习 STL 的 3 个境界

    五、STL 的缺陷


    参考资料

    1. STL教程:C++ STL快速入门(非常详细) (biancheng.net)

    2. C++ STL是什么,有什么用? (biancheng.net)

    3. C++ STL版本有哪些? (biancheng.net)

    4. C++ STL基本组成(6大组件+13个头文件) (biancheng.net)。  

     


    一、什么是 STL

    STL 是 "Standard Template Library" 的缩写,中文可译为 "标准模板库" 或者 "泛型库",其包含有大量的类模板和函数模板,是 C++ 提供的一个基础模板的集合

    STL 最初由惠普实验室开发,于 1998 年被认定为国际标准,正式成为 C++标准库的重要组成部分

    值得一提的是,如今 STL 已完全被内置到支持 C++ 的编译器中,无需额外安装,这可能也是 STL 被广泛使用的原因之一。

    STL 就位于各个 C++ 的头文件中,即它并非以二进制代码的形式提供,而是以源代码的形式提供

    从根本上来说,STL 是一些容器、算法和其他一些组件的集合,所有容器和算法都是总结了十几年来算法和数据结构的研究成果,汇集了许多计算机专家经验的基础上实现的,因此可以说,STL 基本上达到了各种存储方法和相关算法的高度优化。

    注意,这里提到的容器,本质上就是封装有数据结构的类模板,例如 list、vector、set、map 等


    二、STL 的版本

    自 1998 年 ANSI/ISO C++ 标准正式定案,C++ STL 规范版本正式通过以后,由于其是开源的,各个 C++ 编译器厂商在此标准的基础上,实现了满足自己需求的 C++ STL 泛型库,主要包括:

    • HP STL

      HP STL 是 Alexandar Stepanov(STL 标准模板库之父)在惠普 Palo Alto 实验室工作时,与 Meng Lee 合作完成的。HP STL 是开放源码的,即任何人都可以免费使用、复制、修改、发布和销售该软件以及相关文档,但前提是必须在相关文档中,加入 HP STL 版本信息和授权信息。

      HP STL 是 C++ STL 的第一个实现版本,其他版本的 C++ STL 一般是以 HP STL 为蓝本实现出来的。不过,现在已经很少直接使用此版本的 STL 了。

    • SGI STL

      Stepanov 在离开 HP 之后,就加入到了 SGI 公司,并和 Matt Austern 等人共同开放了 SGI STL。严格意义上来说,它是 HP STL 的一个继承版本。和 HP STL 一样,SGI STL 也是开源的,其源代码的可读性非常好,并且任何人都可以修改和销售它。

      注意,SGI STL 只能算是一个 "民间" 版本,因此并不是所有支持 C++ 的编译器都支持 SGI STL,唯一能确定的是,GCC(Linux 下的 C++ 编译器)是支持的,所以 SGI STL 在 Linux 平台上的性能非常出色

    • STLport

      为了使 SGI STL 的基本代码适用于 VC++ 和 C++ Builder 等多种编译器,俄国人 Boris Fomitchev 建立了一个 free 项目来开发 STLport,此版本 STL 是开放源代码的

    • PJ STL

      PJ STL(全称 P.J Plauger STL)是由 P.J.Plauger(美国人,1965 年毕业于普林斯顿大学,物理学专业学士)参照 HP STL 实现出来的,也是 HP STL 的一个继承版本,因此该头文件不仅包含 HP STL 的相关授权信息,同时还有 P.J.Plauger 本人的授权信息。

      其实 PJ STL 是 P.J.Plauger 公司的产品,尽管该公司当时只有 3 个人。

      PJ STL 被 Visual C++ 编译器所采用,但和 PH STL、SGI STL 不同的是,PJ STL 并不是开源的

    • Rouge Wave STL

      该版本的 STL 是由 Rouge Wave 公司开放的,也是继承 HP STL 的一个版本,它也不是开源的

      Rouge Wave STL 用于 Borland C++ Builder 编译器中,我们可以在 C++ Builder 的 Include 子目录中找到该 STL 的所有头文件

      值得一提的是,尽管 Rouge Wave STL 的性能不是很好,但 C++ Builder 对 C++ 语言标准的支持还算不错,所以一定程度上使 Rouge Wave STL 的表现得以改善。

      遗憾的是,由于 Rouge Wave STL 长期没有更新且不完全符合标准,因此 Rouge Wave STL 在 6.0 版本时改用 STLport 版本(之后的版本也都采用了 STLport),不过考虑到和之前版本的兼容,6.0 版本中依旧保留了 Rouge Wave STL

      Rouge Wave 公司在 C++ 程序库领域应该说是大名鼎鼎,对 C++ 标准化的过程出力甚多。不过 Rouge Wave STL 版本不仅更新频率慢,费用还高,基于这两个原因,Borland 在 6.0 版本决定奇用 Rouge Wave STL 而改用 STLport。


    三、STL 的 6 大组件和 13 个头文件

    通常认为,STL 是由容器、算法、迭代器、函数对象、适配器、内存分配器这 6 个部分构成,其中后面 4 个部分是为前面 2 个部分服务的,它们各自的含义如下表所示

    STL 的组成部分含义
    容器(Containers)一些封装数据结构的类模板,例如 vector 向量容器、list 列表容器等
    算法(Algorithms)STL 提供了非常多(大约 100 个)的数据结构算法,它们都被设计成一个个的函数模板,这些算法在 std 命名空间中定义,其中大部分算法都包含在头文件 中,少部分位于头文件
    迭代器(Iterators)在 C++ STL 中,对容器中数据的读和写,是通过迭代器完成的,扮演着容器和算法之间的胶合剂
    函数对象(Functors)如果一个类将 () 运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象(又称仿函数)
    适配器(Adapters)可以使一个类的接口(模板的参数)适配成用户指定的形式,从而让原本不能在一起工作的两个类工作在一起。值得一提的是,容器、迭代器和函数都有适配器。
    内存分配器(Allocators)为容器类模板提供自定义的内存申请和释放功能,由于往往只有高级用户才有改变内存分配策略的需求,因此内存分配器对于一般用户来说,并不常用。

    另外,在惠普实验室最初发行的版本中,STL 被组织成 48 个头文件;但在 C++ 标准中,它们被重新组织为 13 个头文件

    1.      
    2.      
    3.      

    按照 C++ 标准库的规定,所有标准头文件都不再有扩展名。以 为例,此为无扩展名的形式,而 为有扩展名的形式。

    但是,或许为了向下兼容,或许是为了内部组织规划,某些 STL 版本同时存储具备扩展名和无扩展名的两份文件(例如 Visual C++ 支持的 Dinkumware 版本同时具备 );甚至有些 STL 版本同时具有 3 种形式的头文件(例如 SGI 版本同时拥有 );但也有个别的 STL 版本只存在包含扩展名的头文件(例如 C++ Builder 的 Rauge Ware 版本只有

    建议读者养成良好的习惯,遵照 C++ 规范,使用无扩展名的头文件。


    四、学习 STL 的 3 个境界

    简单总结一下,学习 STL 的 3 个境界分别为:能用、明理、能扩展


    五、STL 的缺陷

    1. STL 库的更新太慢了。上一版靠谱的是 C++98,中间的 C++03 基本是一些修订,C++11 出来已经相隔 13 年了,STL 才进一步更新。

    2. STL 现在都没有支持线程安全。并发环境下需要我们自己加锁,且锁的粒度是比较大的。

    3. STL 极度地追求效率,导致内部比较复杂,比如类型萃取、迭代器萃取。

    4. STL 的使用会有代码膨胀的问题,当然这是模板语法本身导致的。

  • 相关阅读:
    如何建立含有逻辑删除字段的唯一索引
    ROS2 从头开始​​:第6部分 - ROS2 中的 DDS,用于可靠的机器人通信
    前端 CSS - 如何隐藏右侧的滚动条 -关于出现过多的滚动条导致界面不美观
    基于redis实现用户登陆
    六月集训(29)分治
    MFIF:Deep Regression Pair Learning
    携职教育:《会计类考证》报考要求与攻略
    JavaSE --- 多线程
    深度学习基础网络整理----AlexNet
    1+1<2 ?! HESIC论文解读
  • 原文地址:https://blog.csdn.net/melonyzzZ/article/details/130841814