[C/C++] C/C++延伸学习系列之STL及Boost库概述

  想要完全搞懂C++是很难的,或许是不太现实的。可是不积硅步,无以致千里,因此抽时间来坚持学习一点,总结一点,多多锻炼几回,相信总有一天咱们会变得"了解"C++。正则表达式

1. C++标准库——STL

1.1 STL简介

  STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工做时所开发出来的。算法

  STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎全部的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来讲提供了更好的代码重用机会。编程

  在C++标准中,STL被组织为下面的13个头文件<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>数组

2.1 算法

  你们都能取得的一个共识是函数库对数据类型的选择对其可重用性起着相当重要的做用。举例来讲,一个求方根的函数,在使用浮点数做为其参数类型的状况下的可重用性确定比使用整型做为它的参数类性要高。而C++经过模板的机制容许推迟对某些类型的选择,直到真正想使用模板或者说对模板进行特化的时候,STL就利用了这一点提供了至关多的有用算法。它是在一个有效的框架中完成这些算法的——你能够将全部的类型划分为少数的几类,而后就能够在模版的参数中使用一种类型替换掉同一种类中的其余类型。网络

  STL提供了大约100个实现算法的模版函数,好比算法for_each将为指定序列中的每个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。这样一来,只要咱们熟悉了STL以后,许多代码能够被大大的化简,只须要经过调用一两个算法模板,就能够完成所须要的功能并大大地提高效率。数据结构

  算法部分主要由头文件<algorithm>,<numeric>和<functional>组成。框架

  <algorithm>是全部STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,能够认为每一个函数在很大程度上都是独立的,其中经常使用到的功能范围涉及到比较、交换、查找、遍历操做、复制、修改、移除、反转、排序、合并等等。数据结构和算法

  <numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操做。函数

  <functional>中则定义了一些模板类,用以声明函数对象。学习

2.2 容器

  在实际的开发过程当中,数据结构自己的重要性不会逊于操做于数据结构的算法的重要性,当程序中存在着对时间要求很高的部分时,数据结构的选择就显得更加剧要。经典的数据结构数量有限,可是咱们经常重复着一些为了实现向量、链表等结构而编写的代码,这些代码都十分类似,只是为了适应不一样数据的变化而在细节上有所出入。STL容器就为咱们提供了这样的方便,它容许咱们重复利用已有的实现构造本身的特定类型下的数据结构,经过设置一些模版类,STL容器对最经常使用的数据结构提供了支持,这些模板的参数容许咱们指定容器中元素的数据类型,能够将咱们许多重复而乏味的工做简化。

  容器部分主要由头文件<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>组成。对于经常使用的一些容器和容器适配器(能够看做由其它容器实现的容器),能够经过下表总结一下它们和相应头文件的对应关系。

向量(vector) 连续存储的元素<vector>
列表(list)  由节点组成的双向链表,每一个结点包含着一个元素<list>
双队列(deque)  连续存储的指向不一样元素的指针所组成的数组<deque>
集合(set)  由节点组成的红黑树,每一个节点都包含着一个元素,节点之间以某种做用于元素对的谓词排列,没有两个不一样的元素可以拥有相同的次序 <set>
多重集合(multiset)  容许存在两个次序相等的元素的集合 <set>
栈(stack)  后进先出的值的排列 <stack>
队列(queue)  先进先出的执的排列 <queue>
优先队列(priority_queue)  元素的次序是由做用于所存储的值对上的某种谓词决定的的一种队列 <queue>
映射(map)  由{键,值}对组成的集合,以某种做用于键对上的谓词排列 <map>
多重映射(multimap)  容许键对有相等的次序的映射 <map>

2.3 迭代器

   下面要说的迭代器从做用上来讲是最基本的部分,但是理解起来比前二者都要费力一些(至少笔者是这样)。软件设计有一个基本原则,全部的问题均可以经过引进一个间接层来

简化,这种简化在STL中就是用迭代器来完成的。

  归纳来讲,迭代器在STL中用来将算法和容器联系起来,起着一种黏和剂的做用。几乎STL提供的全部算法都是经过迭代器存取元素序列进行工做的,每个容器都定义了其自己所专有的迭代器,用以存取容器中的元素。

   迭代器部分主要由头文件<utility>,<iterator>和<memory>组成。

  <utility>是一个很小的头文件,它包括了贯穿使用在STL中的几个模板的声明,

  <iterator>中提供了迭代器使用的许多方法,而对于<memory>的描述则十分的困难,它以不一样寻常的方式为容器中的元素分配存储空间,同时也为某些算法执行期间产生的临时对象提供机制。

  <memory>中的主要部分是模板类allocator,它负责产生全部容器中的默认分配器。

  对于STL的使用,广泛存在着两种观点。第一种认为STL的最大做用在于充当经典的数据结构和算法教材,由于它的源代码涉及了许多具体实现方面的问题。第二种则认为STL的初衷乃是为了简化设计,避免重复劳动,提升编程效率,所以应该是“应用至上”的,对于源代码则没必要深究。笔者则认为分析源代码和应用并不矛盾,经过分析源代码也能提升咱们对其应用的理解,固然根据具体的目的也能够有不一样的侧重。

2. C++“准”标准库——Boost

  Boost 库经过加入一些在实践中很是有用的函数对 C++ 标准进行了补充。 因为 Boost C++ 库是基于 C++ 标准的,因此它们是使用最早进的 C++ 来实现的。 它们是平台独立的,并因为有一个大型的开发人员社区,它能够被包括 Windows 和 Linux 在内的许多操做系统所支持。 Boost库由C++标准委员会库工做组成员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响甚大,是彻彻底底的“准”标准库。Boost因为其对跨平台的强调,对标准C++的强调,与编写平台无关。大部分boost库功能的使用只需包括相应头文件便可,少数(如正则表达式库,文件系统库等)须要连接库。能够说,Boost库是为C++语言标准库提供扩展的一些C++程序库的总称。

  Boost C++ 库能够提高一个 C++ 开发人员的生产力。 例如,你能够从智能指针中受益,帮助你写出更可靠的代码,或者使用某个库来开发平台独立的网络应用。但Boost中也有不少是实验性质的东西,在实际的开发中实用须要谨慎。

  因为博主也属于boost方面的菜鸟,对boost了解也颇有限,这里就很少介绍了,但愿能够和你们一块儿“快乐”的学习和交流C++的知识。boost的官方网站:http://www.boost.org/

相关文章
相关标签/搜索