71 C++ - STL概论
长久以来,软件界一直希望建立一种可重复利用的东西,以及一种得以制造出”可重复运用的东西”的方法,让程序员的心血不止于随时间的迁移,人事异动而烟消云散,从函数(functions),类别(classes),函数库(function libraries),类别库(class libraries)、各种组件,从模块化设计,到面向对象(object oriented ),为的就是复用性的提升。
复用性必须建立在某种标准之上。但是在许多环境下,就连软件开发最基本的数据结构(data structures) 和算法(algorithm)都未能有一套标准。大量程序员被迫从事大量重复的工作,竟然是为了完成前人已经完成而自己手上并未拥有的程序代码,这不仅是人力资源的浪费,也是挫折与痛苦的来源。
为了建立数据结构和算法的一套标准,并且降低他们之间的耦合关系,以提升各自的独立性、弹性、交互操作性(相互合作性,interoperability),诞生了STL。
1. STL基本概念
STL (Standard Template Library
,标准模板库) ,是惠普实验室开发的一系列软件的统
称。现在主要出现在 c++中,但是在引入 c++之前该技术已经存在很长时间了。
STL 从广义上分为: 容器(container) 、算法(algorithm)、 迭代器(iterator),容器和算法之间通过迭代器进行无缝连接。STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。STL(Standard Template Library)标准模板库,在我们 c++标准程序库中隶属于 STL 的占到了 80%以上。
2. STL六大组件简介
STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器。
-
容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种class template。
-
算法:各种常用的算法,如sort、find、copy、for_each。从实现的角度来看,STL算法是一种function tempalte.
-
迭代器:扮演了容器与算法之间的胶合剂,共有五种类型,从实现角度来看,迭代器是一种将operator* , operator-> , operator++,operator–等指针相关操作予以重载的class template. 所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。
-
仿函数:行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了operator()的class 或者class template
-
适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。
-
空间配置器:负责空间的配置与管理。从实现角度看,配置器是一个实现了动态空间配置、空间管理、空间释放的class tempalte.
STL六大组件的交互关系,容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略的变化,适配器可以修饰仿函数。
3. STL优点
STL 是 C++的一部分,因此不用额外安装什么,它被内建在你的编译器之内。
STL 的一个重要特性是将数据和操作分离。数据由容器类别加以管理,操作则由可定制的算法定义。迭代器在两者之间充当“粘合剂”,以使算法可以和容器交互运作
程序员可以不用思考 STL 具体的实现过程,只要能够熟练使用 STL 就 OK 了。这样他们就可以把精力放在程序开发的别的方面。
STL 具有高可重用性,高性能,高移植性,跨平台的优点。
-
高可重用性:STL 中几乎所有的代码都采用了模板类和模版函数的方式实现,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。关于模板的知
识,已经给大家介绍了。 -
高性能:如 map 可以高效地从十万条记录里面查找出指定的记录,因为 map 是采用红黑树的变体实现的。
-
高移植性:如在项目 A 上用 STL 编写的模块,可以直接移植到项目 B 上。
相关文章
- 【c++STL——第十一讲】iterator系列 (常用知识点总结)
- 【c++STL——第一讲】vector系列 (常用知识点总结)
- 关于 C/C++ 函数调用约定
- c++再探string之eager-copy、COW和SSO方案
- C++对C的增强
- 托管C++线程锁实现 c++11线程池
- C++ 浅析 STL 中的 list 容器
- C/C++知识要点2——STL中Vector、Map、Set容器的实现原理
- C++ virtual函数重写,在继承的时候没有在函数前写virtual关键字也依然是虚函数吗?
- 【侯捷】C++STL标准库与泛型编程(第三讲)
- C++程序设计:原理与实践(进阶篇)15.2 STL理念
- C++程序设计:原理与实践(进阶篇)15.9 调整内置数组达到STL版本的功能
- C++STL之string类
- [C++]:万字超详细讲解多态以及多态的实现原理(面试的必考的c++考点)
- 【c++】:STL中vector的模拟使用及模拟实现
- 《C++入门经典(第5版•修订版)》——2.6 问与答
- 《数字图像处理与机器视觉——Visual C++与Matlab实现(第2版)》——2.1.4 读取和写入图像文件
- 基于 C++实现人工智能课程五子棋博弈问题【100010704】
- 机房预约系统(C++)
- C++点云PCL基础ROS代码
- C++的STL中vector内存分配方法的简单探索
- C++: DataGridView::DataSource
- 【C++】STL常用算法
- C++STL【容器】详解
- C++编程规范之20:避免函数过长,避免嵌套过深
- 浅谈C++ STL list 容器
- 详解C++ STL priority_queue 容器
- 浅谈C++ STL vector 容器
- 《STL源代码分析》---stl_stack.h读书笔记
- 《SiamFC++:Towards Robust and Accurate Visual Tracking with Target Estimation Guidelines》论文笔记
- C/C++ Windows API——枚举进程、结束进程及提升权限