<p style="color: #AD5D0F;font-weight: bold;font-size: 20px; font-family: '微软雅黑';">1. STL 基本介绍</p> ------
<p style="font-size: 15px;text-indent:2em;letter-spacing:1px; font-family: '微软雅黑';">C++ STL(标准模板库)是惠普实验室开发的一系列软件的统称,是一套功能强大的 C++ 模板类。STL的目的是为了<font color="#ff0000">标准化组件</font>,这样就不用重新开发,让后来者可以使用现成的组件,和开源组件有点殊途同归。 STL的版本很多,常见的有<font color="#ff0000">HP STL、PJ STL、 SGI STL</font>等,另外,STL库属于C++标准库的一部分,两者是包含关系。</p>
<p style="font-size: 15px;text-indent:2em;letter-spacing:1px; font-family: '微软雅黑';">由于我平时的编程环境主要在Linux系统下,所以在后面总结中,我会主以<font color="#ff0000">GNU ISO C++ Library中的STL源码(5.2.1版本)</font>为主,同时辅以<font color="#ff0000">SGI STL 2.91</font>源代码来进行分析总结,附带 SGI 主要是因为 SGI STL 版本比较早,代码可读性相对会好一点。</p> <p style="font-size: 15px;text-indent:2em;letter-spacing:1px; font-family: '微软雅黑';">至于源码码获取方法: GNU C++库是在Linux 系统的/usr/include/目录下;sgi库的话,到网上搜一下应该就有,我是从这个链接中下载的: </p>
https://sourceforge.net/projects/sgistl/?source=navbar
bash-4.2$ ls /usr/include/c++/4.8.5/
algorithm cerrno complex cstdint debug future list profile stdexcept typeindex
array cfenv complex.h cstdio decimal initializer_list locale queue streambuf typeinfo
atomic cfloat condition_variable cstdlib deque iomanip map random string type_traits
backward chrono csetjmp cstring exception ios memory ratio system_error unordered_map
bits cinttypes csignal ctgmath ext iosfwd mutex regex tgmath.h unordered_set
bitset ciso646 cstdalign ctime fenv.h iostream new scoped_allocator thread utility
cassert climits cstdarg cwchar forward_list istream numeric set tr1 valarray
ccomplex clocale cstdbool cwctype fstream iterator ostream sstream tr2 vector
cctype cmath cstddef cxxabi.h functional limits parallel stack tuple x86_64-redhat-linux
<p style="font-size: 15px;font-weight: bold;text-indent:2em;letter-spacing:1px; font-family:'微软雅黑';">STL库和C++标准库关系:</p>
<p style="font-size: 15px;text-indent:2em;letter-spacing:1px; font-family: '微软雅黑';">STL库和C++标准库关系图(图片来自网络)</p>
<p style="color: #AD5D0F;font-weight: bold;font-size: 20px; font-family: '微软雅黑';">2. STL 体系结构</p> ------
<p style="font-size: 15px;text-indent:2em;letter-spacing:1px; font-family: '微软雅黑';">STL六大组件 </p>
<p style="font-size: 15px;text-indent:2em;letter-spacing:1px; font-family: '微软雅黑';">STL主要包含六大组件,每个组件负责不一样的功能,也涉及到不一样的知识点,其中属容器和算法最为主要,其他组件起到牵线 搭桥的作用,让算法和容器能够融合的更好,更方便使用。组件之间的大体关系如下图(图片来自网络):</p>
<p style="font-size: 15px;text-indent:2em;letter-spacing:1px; font-family: '微软雅黑';font-weight: bold;"><font color="#ff0000">六大组件的交互关系:container(容器) 通过 allocator(配置器) 取得数据储存空间,algorithm(算法)通过 iterator(迭代器)存取 container(容器) 内容,functor(仿函数) 可以协助 algorithm(算法) 完成不同的策略变化,adapter(配接器) 可以修饰或套接 functor(仿函数)。</font></p>
<p style="color: #AD5D0F;font-weight: bold;font-size: 20px; font-family: '微软雅黑';">3. 分析实现 STL 所需要的技能</p> ------ <p style="font-size: 15px;text-indent:2em;letter-spacing:1px; font-family: '微软雅黑';">在Effective C++第一节中就有总结,C++是一个多重范式的编程语言,同时支持过程式形式,面向对象形式,函数形式,泛型形式,及元编程形式。那在我们平时开发过程中,接触的比较多的是过程式和面向对象形式。而STL则是泛型编程(GP)的集大成,那么对于GP,<font color="#ff0000">我们必须要有模板编程的基础,了解类模板,函数模板,成员函数模板,模板特化,模板偏特化等</font>。然后还有就是熟悉<font color="#ff0000">操作符重载</font>,因为STL中容器存储的元素是不确定的(泛型),那对于这些用户自定义的类型,也需要有类似于基本类型(类似int)的运算操作</p>
<p style="font-size: 15px;text-indent:2em;letter-spacing:1px; font-family: '微软雅黑';">总的来讲,模板和运算符重载是学习STL必要的的技术基础。 </p>
<p style="color: #AD5D0F;font-weight: bold;font-size: 20px; font-family: '微软雅黑';">4. 研究 STL 的收获</p> ------
<p style="font-size: 15px;text-indent:2em;letter-spacing:1px; font-family: '微软雅黑';"> 我在学习某一个东西的时候,总会问自己,我为什么要学习这个东西? 那么掌握STL可以给我们带来什么呢?</p> <p style="font-size: 15px;text-indent:2em;letter-spacing:1px; font-family: '微软雅黑';"> 1. 首先,对于C++这门语言来讲,<font color="#ff0000">C++主要可以分为四个部分,C,Object-Oriented C++,Template C++,STL</font> (Effective C++上总结),那么为了对C++有个全面的认识和掌握,我们就要去了解和研究STL,掌握泛型思想。 当然,现在来讲,C++ 11/17/20 及 boost 中对原有C++的使用优化,相关先进特性,以及对一些其他高级技术的实现和封装(多线程和多进程等),也是现代C++的组成部分,同样需要我们去学习和掌握。</p> <p style="font-size: 15px;text-indent:2em;letter-spacing:1px; font-family: '微软雅黑';"> 2. 图灵奖得主Pascal之父——Nicklaus Wirth曾经说过 <font color="#ff0000">程序设计 = 算法 + 数据结构</font>,刚好,对于想要学习或者巩固数据结构和算法能力的人来说,STL就是一个宝库,里面容器底层就是各种经典的数据结构实现的,主流的基本算法也包含在里面 。</p>
<p style="font-size: 15px;text-indent:2em;letter-spacing:1px; font-family: '微软雅黑';"> 因此,对于STL进行分析总结,并加以实现,可以提升我们的语言掌握度及相关编程思维,还有就是数据抽象能力!</p> <p style="font-size: 15px;text-indent:80em;letter-spacing:1px; font-family: '微软雅黑';">2018-08-29 23:27:46</p>
来源:oschina
链接:https://my.oschina.net/u/4282838/blog/3847666