17.1 STL基本概念

17.1 STL基本概念

一、基本概念

  STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。

  从逻辑层次来看,在STL中体现了泛型化程序设计的思想(generic programming),引入了诸多新的名词,比如像需求(requirements),概念(concept),模型(model),容器(container),算法(algorithmn),迭代子(iterator)等。与OOP(object-oriented programming)中的多态(polymorphism)一样,泛型也是一种软件的复用技术。

  从实现层次看,整个STL是以一种类型参数化(type parameterized)的方式实现的,这种方式基于一个在早先C++标准中没有出现的语言特性–模板(template)。如果查阅任何一个版本的STL源代码,你就会发现,模板作为构成整个STL的基石是一件千真万确的事情。除此之外,还有许多C++的新特性为STL的实现提供了方便。

二、STL的六大组件

  1. 容器(Container),是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器;

  2. 迭代器(Iterator),提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象;

  3. 算法(Algorithm),是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象,函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用;

  4. 仿函数(Function object,仿函数(functor)又称之为函数对象(function object),其实就是重载了()操作符的struct,没有什么特别的地方

  5. 适配器(Adaptor)修饰容器或仿函数或迭代器接口的东西

  6. 空间配制器(allocator)其中主要工作包括两部分1.对象的创建与销毁 2.内存的获取与释放

STL六大组件之间的关系:
  容器通过配置器取得数据存储空间,算法通过迭代器获取容器内容,仿函数可以协助算法完成不同的策略变化,适配器可以修饰或套界仿函数。


1.STL容器

序列式容器(Sequence containers),每个元素都有固定位置--取决于插入时机和地点,和元素值无关,vector、deque、list;

  • Vectors:将元素置于一个动态数组中加以管理,可以随机存取元素(用索引直接存取),数组尾部添加或移除元素非常快速。但是在中部或头部安插元素比较费时;

  • Deques:是“double-ended queue”的缩写,可以随机存取元素(用索引直接存取),数组头部和尾部添加或移除元素都非常快速。但是在中部或头部安插元素比较费时;

  • Lists:双向链表,不提供随机存取(按顺序走到需存取的元素,O(n)),在任何位置上执行插入或删除动作都非常迅速,内部只需调整一下指针;

关联式容器(Associated containers),元素位置取决于特定的排序准则,和插入顺序无关,set、multiset、map、multimap;

  • Sets/Multisets:内部的元素依据其值自动排序,Set内的相同数值的元素只能出现一次,Multisets内可包含多个数值相同的元素,内部由二叉树实现(实际上基于红黑树(RB-tree)实现),便于查找;

  • Maps/Multimaps:Map的元素是成对的键值/实值,内部的元素依据其值自动排序,Map内的相同数值的元素只能出现一次,Multimaps内可包含多个数值相同的元素,内部由二叉树实现(实际上基于红黑树(RB-tree)实现),便于查找;

另外有其他容器hash_map,hash_set,hash_multiset,hash_multimap。

容器的比较:
17.1 STL基本概念_第1张图片
2.STL迭代器

  • 迭代器(iterator):扮演容器与算法之间的胶合剂,是所谓的“泛型指针”。共有5种类型
  • 迭代器模式:提供一种方法,使之能够依序寻访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表达方式。
  • STL的中心思想在于:将数据容器和算法分开,彼此独立设计,最后再以一贴胶着剂(iterator)将它们撮合在一起。
  • STL的迭代器是一个可遍历STL容器全部或者部分数据的智能指针。
  • 迭代器原理:迭代器是一种行为类似智能指针的对象,而指针最常见的行为就是内容提领和成员访问。因此迭代器最重要的行为就是对operator*和operator->进行重载。

3.STL算法

STL算法部分主要由头文件,,组成。

  • 要使用 STL中的算法函数必须包含头文件
  • 对于数值算法须包含
  • 中则定义了一些模板类,用来声明函数对象。

STL中算法大致分为七类:

  • 非可变序列算法:指不直接修改其所操作的容器内容的算法。

  • 可变序列算法:指可以修改它们所操作的容器内容的算法。

  • 排序算法:包括对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作。

  • 数值算法:对容器内容进行数值计算。

  • 变值算法:

  • 删除算法:

  • 有序区间算法:

4.适配器

基本概念:适配器, 在STL中扮演着转换器的角色,本质上是一种设计模式,用于将一种接口转换成另一种接口,从而是原本不兼容的接口能够很好地一起运作。

基本类型:根据目标接口的类型,适配器可分为以下几类:

  • 改变容器的接口,称为容器适配器;

  • 改变迭代器的接口,称为迭代器适配器;

  • 改变仿函数的接口,称为仿函数适配器。

5.仿函数

仿函数又称函数对象,它本质上是 一种具有函数特质的对象,它重载了operator()运算符,我们可以像使用函数一样使用该对象。

  • 仿函数的作用:在C++的STL提供的各种算法,例如sort()。往往有两个版本,其中一个是最长用的某种运算的版本(operator<);第二个版本则表现出最泛化的演算流程,允许用户“以template参数来指定所需要采取的策略”。
  • 仿函数产生的原因:由于函数指针毕竟不能满足STL对抽象对象的需求,也不能满足软件积木的需求——函数指针无法和STL其它组件(如配接器adapter)搭配使用,产生更灵活的变化。

6.空间配制器

其中主要工作包括两部分:

  • 对象的创建与销毁
  • 内存的获取与释放

有关控件配置器的相关内容参见博客:https://blog.csdn.net/xy913741894/article/details/66974004

你可能感兴趣的:(C++完整学习笔记)