1. STL 基本介绍

C++ STL(标准模板库)是惠普实验室开发的一系列软件的统称,是一套功能强大的 C++ 模板类。STL的目的是为了标准化组件,这样就不用重新开发,让后来者可以使用现成的组件,和开源组件有点殊途同归。 STL的版本很多,常见的有HP STL、PJ STL、 SGI STL等,另外,STL库属于C++标准库的一部分,两者是包含关系。

由于我平时的编程环境主要在Linux系统下,所以在后面总结中,我会主以GNU ISO C++ Library中的STL源码(5.2.1版本)为主,同时辅以SGI STL 2.91源代码来进行分析总结,附带 SGI 主要是因为 SGI STL 版本比较早,代码可读性相对会好一点。

至于源码码获取方法: GNU C++库是在Linux 系统的/usr/include/目录下;sgi库的话,到网上搜一下应该就有,我是从这个链接中下载的:

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

STL库和C++标准库关系:

STL库和C++标准库关系图(图片来自网络)

2. STL 体系结构

STL六大组件

STL主要包含六大组件,每个组件负责不一样的功能,也涉及到不一样的知识点,其中属容器和算法最为主要,其他组件起到牵线
搭桥的作用,让算法和容器能够融合的更好,更方便使用。组件之间的大体关系如下图(图片来自网络):

六大组件的交互关系:container(容器) 通过 allocator(配置器) 取得数据储存空间,algorithm(算法)通过 iterator(迭代器)存取 container(容器) 内容,functor(仿函数) 可以协助 algorithm(算法) 完成不同的策略变化,adapter(配接器) 可以修饰或套接 functor(仿函数)。

3. 分析实现 STL 所需要的技能

在Effective C++第一节中就有总结,C++是一个多重范式的编程语言,同时支持过程式形式,面向对象形式,函数形式,泛型形式,及元编程形式。那在我们平时开发过程中,接触的比较多的是过程式和面向对象形式。而STL则是泛型编程(GP)的集大成,那么对于GP,我们必须要有模板编程的基础,了解类模板,函数模板,成员函数模板,模板特化,模板偏特化等。然后还有就是熟悉操作符重载,因为STL中容器存储的元素是不确定的(泛型),那对于这些用户自定义的类型,也需要有类似于基本类型(类似int)的运算操作

总的来讲,模板和运算符重载是学习STL必要的的技术基础。

4. 研究 STL 的收获

我在学习某一个东西的时候,总会问自己,我为什么要学习这个东西? 那么掌握STL可以给我们带来什么呢?

1. 首先,对于C++这门语言来讲,C++主要可以分为四个部分,C,Object-Oriented C++,Template C++,STL (Effective C++上总结),那么为了对C++有个全面的认识和掌握,我们就要去了解和研究STL,掌握泛型思想。 当然,现在来讲,C++ 11/17/20 及 boost 中对原有C++的使用优化,相关先进特性,以及对一些其他高级技术的实现和封装(多线程和多进程等),也是现代C++的组成部分,同样需要我们去学习和掌握。

2. 图灵奖得主Pascal之父——Nicklaus Wirth曾经说过 程序设计 = 算法 + 数据结构,刚好,对于想要学习或者巩固数据结构和算法能力的人来说,STL就是一个宝库,里面容器底层就是各种经典的数据结构实现的,主流的基本算法也包含在里面 。

因此,对于STL进行分析总结,并加以实现,可以提升我们的语言掌握度及相关编程思维,还有就是数据抽象能力!

2018-08-29 23:27:46

C++ 标准模板库介绍(STL)的更多相关文章

  1. C++标准模板库(STL)和容器

    1.什么是标准模板库(STL)? (1)C++标准模板库与C++标准库的关系 C++标准模板库其实属于C++标准库的一部分,C++标准模板库主要是定义了标准模板的定义与声明,而这些模板主要都是 类模板 ...

  2. 【常用技巧】标准模板库(STL)

    [常用技巧]标准模板库(STL) 在前几个章节中我们已经使用了诸如队列.堆.堆栈.vector 等标准模板库中的模板,切身感受到了它给我们带来的极大便利.在本节中,我们还要介绍两种标准模板——stri ...

  3. C++ 标准模板库(STL)——容器(Containers)的用法及理解

    C++ 标准模板库(STL)中定义了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量(vector).队列(queue).栈(stack).set.map等.这次主要 ...

  4. STL标准模板库介绍

    1. STL介绍 标准模板库STL是当今每个从事C++编程的人需要掌握的技术,所有很有必要总结下 本文将介绍STL并探讨它的三个主要概念:容器.迭代器.算法. STL的最大特点就是: 数据结构和算法的 ...

  5. C++标准模板库(STL)之Vector

    在C中,有很多东西需要自己实现.C++提供了标准模板库(Standard Template Libray,STL),其中封装了很多容器,不需要费力去实现它们的细节而直接调用函数来实现功能. 具体容器链 ...

  6. C++ 标准库和标准模板库(STL)

    转自原文http://blog.csdn.net/sxhelijian/article/details/7552499 一.C++标准库 C++标准库的内容分为10类,分别是(建议在阅读中,将你已经用 ...

  7. 日常笔记6C++标准模板库(STL)用法介绍实例

    一.vector常见用法详解 vector翻译为向量,但是这里翻译成变长数组的叫法更好理解. 如果typename是一个STL容器,定义的时候要记得在>>符号之间加上空格,因为在C++11 ...

  8. C++标准模板库(STL)常用介绍

    1. 输入输出 C++既可以用C的scanf和printf,也可以用新增的的cin与cout,后者速度慢 1.1 C程序中输入输出 int a; scanf("%d",&a ...

  9. C++标准模板库(STL)介绍:string的基本用法

    1.带空格的字符串的输入 getline(cin, str)

随机推荐

  1. Codeforces Round #259 (Div. 1)A(公式)

    传送门 题意 给出m个面的骰子扔n次,取最大值,求期望 分析 暴力算会有重复,而且复杂度不对. 考虑m个面扔n次得到m的概率,发现只要减去(m-1)个面扔n次得到m-1的概率即可,给出example说 ...

  2. bzoj 1103: [POI2007]大都市meg【dfs序+树状数组】

    很明显的暗示,就是在树的dfs序上维护树状数组,加减的时候差分即可 #include<iostream> #include<cstdio> #include<cstrin ...

  3. bzoj 3598: [Scoi2014]方伯伯的商场之旅【数位dp】

    参考了这个http://www.cnblogs.com/Artanis/p/3751644.html,好像比一般方法好写 大概思想就是先计算出把所有石子都合并到1位置的代价,这样显然有一些是不优的,然 ...

  4. 《Google软件测试之道》心得笔记1

    Google软件测试介绍 把开发和测试融合在一起——开发和测试必须同时展开 开发人员自己要对自己写的代码负责,比专职的测试人员更适合做测试工作. 测试开发工程师SET 对于Google拥有很少量的测试 ...

  5. win7 右键菜单残影 消除方法

    1. 治标法: 右键桌面->更改分辨率  随便换一个分辨率再还原就OK了! 2. 根治法: 我的电脑-> 属性 ->高级选项-> 高级-> 设置-> 自定义   不 ...

  6. Hdu 5371 Hotaru's problem (manacher+枚举)

    题目链接: Hdu 5371 Hotaru's problem 题目描述: 给出一个字符串N,要求找出一条N的最长连续子串.这个子串要满足:1:可以平均分成三段,2:第一段和第三段相等,3:第一段和第 ...

  7. 一个页面通过iframe,获取另一个页面的form

    document.getElementsByTagName("iframe")[0].contentWindow.document.forms[0].submit(); var z ...

  8. c#中stringbuilder的方法总结

    String 对象是不可改变的.每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.在需要对字符串执行重复修改的情况下,与创建新 ...

  9. 老式浏览器支持html5和css3

    在IE页面的head标签里面加入   <!-[if IE]> <script src="http://html5shiv.googlecode.com/svn/trunk/ ...

  10. CCF|跳一跳

    import java.util.Scanner; public class Main { public static void main (String[] args) { Scanner scan ...