[STL系列]开篇简单介绍

开篇:

为了应付上机考,现在需要总结下关于STL的基础知识。由于以前各种代码都喜欢从头搭起,像这种现成的牛逼的STL就没怎么看,真是作死。现在来突击啦。

开始之前,简单看一段代码,功能很简单,就是要实现对一组数字的排序,以窥STL的一斑。

 1 #include "iostream"
 2 #include <algorithm>
 3 #include <vector>
 4 using namespace std;
 5
 6 int main()
 7 {
 8     vector<int> score;
 9     for(int i=0;i<15;i++)
10     {
11         score.push_back(rand()%100);
12     }
13     vector<int>::iterator bItr=score.begin();
14     vector<int>::iterator eItr=score.end();
15     cout<<"\nBefore Sort:\n";
16     for_each(bItr,eItr,[](int x)->void{cout<<x<<" ";});
17     cout<<"\nAfter Sort:\n";
18     sort(bItr,eItr);
19     for_each(bItr,eItr,[](int x)->void{cout<<x<<" ";});
20 }

以上这段代码简化得蛮极致的吧,采用vector做为数据容器。首先利用for_each()算法,显示数组内容;再调用sort()排序算法,对数组进行排序。然后再使用for_each()算法,完成对排序后数组的展示。

三行关键代码。这就是STL的魅力。这段程序还有一些细节值得注意,这里不展开了。

正文:

言归正传,开始简单介绍下STL。

STL,即Standard Template Library,标准模板库。

(以下摘自百度百科)

STL是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。这可能是一个历史上最令人兴奋的工具的最无聊的术语。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。

STL被内建在你的编译系统之内。STL的版本很多,常见的有HP STL、PJ STL、 SGI STL等。

STL组成:

包含容器(containers)、迭代器(iterators)、空间配置器(allocator)、适配器(adapters)、算法(algorithms)、仿函数(functors)六个部分。

常用的STL头文件:

(容器部分)<deque>、<vector>、<list>、<map>、<set>、<array>、<forward_list>、<unordered_map>、<unordered_set>、<queue>、<stack>

(迭代器部分)<iterator>、<memory>、<utility>

(适配器)<stack>、<queue>(容器类适配器)

(算法部分)<algorithm>、<functional>、<numeric>

相关概念:

1、容器(Containers)

各种数据结构,如Vector,List,Deque,Set,Map,用来存放数据,STL容器是一种Class Template,就体积而言,这一部分很像冰山载海面的比率。

2、算法(Algorithms)

各种常用算法如Sort,Search,Copy,Erase,从实现的角度来看,STL算法是一种Function Templates。可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。<functional>中则定义了一些模板类,用以声明函数对象。

3、迭代器(Iterators)

扮演容器与算法之间的胶合剂,是所谓的“泛型指针”,共有五种类型,以及其它衍生变化,从实现的角度来看,迭代器是一种将:Operators*,Operator->,Operator++,Operator--等相关操作予以重载的Class Template。所有STL容器都附带有自己专属的迭代器——是的,只有容器设计者才知道如何遍历自己的元素,原生指针(Native pointer)也是一种迭代器。(补充:软件设计有一个基本原则,所有的问题都可以通过引进一个间接层来简化,这种简化在STL中就是用迭代器来完成的)

4、仿函数(Functors)

行为类似函数,可作为算法的某种策略(Policy),从实现的角度来看,仿函数是一种重载了Operator()的Class 或 Class Template。一般函数指针可视为狭义的仿函数。

仿函数(functors)在C++标准中采用的名称是函数对象(function objects)。仿函数主要用于STL中的算法中,虽然函数指针虽然也可以作为算法的参数,但是函数指针不能满足STL对抽象性的要求,也不能满足软件积木的要求--函数指针无法和STL其他组件搭配,产生更灵活变化。

仿函数本质就是类重载了一个operator()的struct,创建一个行为类似函数的对象。例如下面就是一个仿函数的例子

struct plus{
    int operator()(const int& x, const int& y) const { return x + y; }
};  

然后就可以如下这样使用

int a=1, b=2;
cout<<plus(a,b);  

5、配接器(适配器)(Adapters)

一种用来修饰容器(Containers)或仿函数(Functors)或迭代器(Iterators)接口的东西,例如:STL提供的Queue和Stack,虽然看似容器,其实只能算是一种容器配接器,因为 它们的底部完全借助Deque,所有操作有底层的Deque供应。(分三种类型)改变Functor接口者,称为Function Adapter;改变Container接口者,称为Container Adapter;改变Iterator接口者,称为Iterator Adapter。配接器的实现技术很难一言蔽之,必须逐一分析。

6、分配器(Allocators)

负责空间配置与管理,从实现的角度来看,配置器是一个实现了动态空间配置、空间管理、空间释放的Class Template。

——参考《STL源码剖析》

时间: 2024-10-07 22:16:28

[STL系列]开篇简单介绍的相关文章

Https系列之一:https的简单介绍及SSL证书的生成

Https系列会在下面几篇文章中分别作介绍: 一:https的简单介绍及SSL证书的生成二:https的SSL证书在服务器端的部署,基于tomcat,spring boot三:让服务器同时支持http.https,基于spring boot四:https的SSL证书在Android端基于okhttp,Retrofit的使用 所有文章会优先在:微信公众号"颜家大少"中发布转载请标明出处 一:本文的主要内容介绍 https的介绍SSL证书的介绍自签名SSL证书介绍及生成方法CA证书介绍及申

JBoss 系列九十六:JBoss MSC - 简单介绍及一个简单示例

什么是 JBoss MSC JBoss MSC 即 JBoss Modular Service Container,是第三代 JBoss 产品 JBoss 7和WildFfly的内核,JBoss MSC 替换了之前的 JMX Kernel 和 MicroContainer,它主要特定可以总结如下三点: 高并发容器(A highly concurrent state machine) 无多相位,设计简单(No multiple phases, much simpler) 不依赖 JMX 和 Jav

《STL系列》之map原理及实现

上一篇文章<STL系列>之vector原理及实现,介绍了vector的原理及实现,这篇文章介绍map的原理及实现.STL实现源码下载.STL中map的实现是基于RBTree的,我在实现的时候没有采用RBTree,觉得这东西有点复杂,我的map采用的是排序数组(CSortVector).map中的Key存在排序数据中,通过二分查找判断某个Key是否在map中,时间复杂度为O(logN).在用一个CVector存Key和Value,为了方便拿到Key和Value,这里有点冗余,Key被存了两次.现

【转】Entity Framework技术导游系列开篇与热身

转自:http://blog.csdn.net/bitfan/article/details/12779517 Entity Framework走马观花 之 把握全局 ========================================= 这是一个系列文章 上一篇<Entity Framework技术导游系列开篇与热身 > ========================================= 在深入学习某项技术之前,应该努力形成对此技术的总体印象,并了解其基本原理,本

STL系列之六 set与hash set

STL系列之六 set与hash_set set和hash_set是STL中比较重要的容器,有必要对其进行深入了解.在STL中,set是以红黑树(RB-tree)作为底层数据结构的,hash_set是以Hash table(哈希表)作为底层数据结构的.set可以在时间复杂度为O(logN)情况下插入.删除和查找数据.hash_set操作的时间复杂度则比较复杂,这取决于哈希函数和哈希表的负载情况.下面列出set和hash_set的常用函数: set和hase_set的更多函数请查阅MSDN. se

iOS开发基础-UITableView控件简单介绍

 UITableView 继承自 UIScrollView ,用于实现表格数据展示,支持垂直滚动.  UITableView 需要一个数据源来显示数据,并向数据源查询一共有多少行数据以及每一行显示什么内容等.凡是遵守 UITableViewDataSource 协议的Objc对象,都可以是 UITableView 的数据源.  - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView  返回共有多少组数据.  - (NSI

EventMachine 系列之简单的服务器

摘要:Dota(Defence of the Ancients,远古的守护), 是指基于魔兽争霸3:冰封王座(暴雪娱乐公司出品)的多人即时对战自定义地图,可支持10个人同时连线游戏.Dota以对立的两个小队展开对战,通常是5v5,游戏目的是守护自己的远古遗迹(近卫方的生命之树.天灾方的冰封王座),同时摧毁对方的远古遗迹.DotA是目前唯一被暴雪娱乐公司官方认可的魔兽争霸RPG.Dota在大学生中的风靡程度令人咂舌,而随着玩家对游戏的理解深入,本身存在于游戏中的许多数学模型被挖掘出来进行研究.游戏

Scheme语言--简单介绍

一年前事实上有时间看完SICP这本书,后来由于种种原因,一直没有继续再学.由于SICP中使用Scheme确实应用不多.在Java,C++的语言眼里,Scheme确实非常另类.现在MIT已经放弃了使用Scheme作为SICP的教学语言而转向python之际,我在此開始学习这本书与这门语言的学习.SICP主要使用Scheme语言来解决计算机科学中的一些问题.为了督促自己,每天都能学习.积小流而成江海,把自己的学习过程放在这里,以供自己复习. 本系列主要包含两部分Scheme语言层面的问题及SICP中

让你提前认识软件开发(25):数据库简单介绍

第2部分 数据库SQL语言 数据库简单介绍 数据库是个通用化的综合性的数据集合.它可以供各种用户共享且具有最小的冗余度和较高的数据与程序的独立性. 眼下,国际上主导的大型数据库管理系统有ORACLE.SQL SERVER.SYBASE.INFORMIX和INGRES等. 数据库中经常使用的编程语言是SQL语言,按其功能可分为四大部分: (1) 数据定义语言(Data Definition Language.DDL),用于定义.撤销和改动数据模式. (2) 数据查询语言(Data Query La