文章目录
前言
路漫漫其修远兮,吾将上下而求索;
一、什么是STL
STL(standard template libaray 标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架;
注:标准库指的是C++所有官方实现的库;而STL(标准模板库),用模板去实现常见的数据结构与算法;C++之中提供的标准库中提供数据结构和算法的一套库,以方便我们去使用;
Q:标准库中除了STL还有什么?
- IO流库、线程库、异常、智能指针……
二、STL的版本
STL(Standard Template Library)的设计与实现并非由C++创始人本贾尼·斯特劳斯特鲁普(Bjarne Stroustrup)直接完成,而是由Alexander Stepanov、David Musser和 Meng Lee在惠普实验室开发。该项目后来以开源方式发布,代码开放给社区,最终被纳入C++标准库,成为现代C++的核心组成部分。STL的核心贡献在于引入了泛型编程范式,提供了容器、算法和迭代器的高效抽象,极大提升了C++的灵活性和性能表现。
注:开源有一个开源协议的要求:如果你进行了有效的修改,你也要像原始版本一样开源(不开源的话,别人有权告你);
1、原始版本
Alexander Stepanov 、David Musser、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费;唯一条件就是也需要向原始版本一样做开源使用;HP版本——所有STL实现版本的始祖;
2、P.J.版本
P.J. Plauger 基于 HP STL 开发了自己的实现,并创立了 Dinkumware 公司来提供商业化的 C/C++ 标准库实现;不能公开或者修改,缺陷:可读性比较差,符号命名比较怪异; Microsoft Visual C++ 长期采用 Dinkumware 的 STL (以及整个 C++ 标准库) 作为其实现基础。直到较新版本的 MSVC (如 VS 2019/2022 的部分版本) 才开始逐步替换为微软自研的实现(但仍有继承关系)
3、RW版本
由Rouge Wage 公司开发,继承自HP版本,被 Borland C++ Builder采用,不能公开或者修改,可读性一般;大概二十年前,Builder 比较出名的,但是后来被微软干掉,没人维护于是就没落了;
4、SGI版本
由Silicon Graputer Systems ,Ins 公司开发,继承自HP版本,被 GNU C++ Library (libstdc++
) 采用作为其 STL 部分的基础实现。而 libstdc++
是 GCC (GNU Compiler Collection) 的默认 C++ 标准库,因此广泛应用于 Linux 系统以及其他使用 GCC 的平台(如早期的 Mac OS X, Cygwin, MinGW 等);SGI版本可移植性好,可公开、修改甚至贩卖,从命名风格和编程风格上看,阅读性非常高。
我们在谈STL这个库的时候需要注意在VS版本下的STL源代码与Linux 下STL的源代码是不一样的;虽然P.J.版本和SGI版本会提供相同的接口,但是其底层实现是不同的(eg. string的扩容方式;在SGI版本中采用2倍扩容,但是P.J.版本是1.5 倍扩容);
三、闭源、开源
需要注意的是,计算机中的源代码分为闭源、开源;
- 闭源:由商业公司开发的,其源代码不会对外公布;eg.Windows、mas oc
- 开源:eg.Linux、git 开源就意味着免费;因为免费,所以各公司的服务器都是部署在Linux 上面;如果公司有一些特殊需求,可以招一些搞内核的人,对操作系统进行一些改造(重写驱动等)
注:Gitub 是利用git 这个开源项目去搭建的网站而形成的一个“社会”;
Q: 闭源与开源分别有什么优缺点?
- 开源的项目如果不是特别出名,是很难维护起来的,即使比较出名的开源项目可能到一定的阶段就有可能没有多少人去维护;闭源的项目,具有商业性质,会以公司的性质去招募一些人来对这个闭源项目进行维护、发展;不要认为开源一定好,而闭源的不一定好……其实开源和闭源各有各的好处;
四、STL的六大组件
STL的核心是数据结构与算法,但其中又分为了6大组件
其中空间配置器就是内存池;
内存池是给容器使用的;因容器可能会高频地申请释放内存,不建立内存池便会在堆上向操作系统申请空间,而不停地打断操作系统会有严重的效率损失,故而STL给他自己所有的容器统一建立了一个内存池以供其专用以提高这些数据结构申请、释放内存的效率;需要注意的是,部分算法若会高频地申请、释放内存,内存池也会给部分算法使用,eg.归并排序;
总结
1、STL(standard template libaray 标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架;
2、STL在C++的学习中非常重要,需要我们熟练掌握容器接口的使用……