从零开始学C++之STL(一):STL六大组件简介

从零开始学C++之STL(一):STL六大组件简介

一、STL简介

① 泛型程序设计

  泛型编程(generic programming)
       将程序写得尽可能通用
       将算法从数据结构中抽象出来,成为通用的
       C++的模板为泛型程序设计奠定了关键的基础

② 什么是STL

  1、STL(Standard Template Library),即标准模板库,是一个高效的C++程序库。
  2、包含了诸多在计算机科学领域里常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性

  3、从逻辑层次来看,在STL中体现了泛型化程序设计的思想(generic programming)在这种思想里,大部分基本算法被抽象,被泛化,独立于与之对应的数据结构,用于以相同或相近的方式处理各种不同情形。

  4、从实现层次看,整个STL是以一种类型参数化(type parameterized)的方式实现的基于模板(template)

二、STL组件

  Container(容器) 各种基本数据结构
  Adapter(适配器) 可改变containers、Iterators或Function object接口的一种组件
  Algorithm(算法) 各种基本算法如sort、search…等
  Iterator(迭代器) 连接containers和algorithms
  Function object(函数对象) 
  Allocator(分配器)

  ① 容器

  容器类是容纳、包含一组元素或元素集合的对象
  七种基本容器:向量(vector)、双端队列(deque)、列表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)

  标准容器的成员绝大部分都具有共同的名称

  序列式容器

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

  关联式容器

  关联式容器Associative containers,元素位置取决于特定的排序准则以及元素值,和插入次序无关。(set、multiset、map、multimap)

  1、需要频繁在序列中间位置上进行插入和/或删除操作且不需要过多地在序列内部进行长距离跳转,应该选择list

  2、vector头部与中间插入删除效率较低,在尾部插入与删除效率高。
  3、deque是在头部与尾部插入与删除效率较高

  set/map/multiset/multimap 

  set,同map一样,所有元素都会根据元素的键值自动被排序,因为set/map两者的所有各种操作,都只是转而调用RB-tree的操作行为,不过,值得注意的是,两者都不允许两个元素有相同的键值。

   不同的是:set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素同时拥有实值和键值,且实值就是键值,键值就是实值,而map的所有元素都是pair,同时拥有实值(value)和键值(key),pair的第一个元素被视为键值,第二个元素被视为实值。

      至于multiset/multimap,他们的特性及用法和set/map完全相同,唯一的差别就在于它们允许键值重复,即所有的插入操作基于RB-tree的insert_equal()而非insert_unique()。In computer science, a multimap (sometimes also multihash) is a generalization of a map or associative array abstract data type in which more than one value may be associated with and returned for a given key.

  typedef bool _Rb_tree_Color_type;

  const _Rb_tree_Color_type _S_rb_tree_red = false;

  const _Rb_tree_Color_type _S_rb_tree_black = true;

  struct _Rb_tree_node_base

  {

      typedef _Rb_tree_Color_type _Color_type;

      typedef _Rb_tree_node_base* _Base_ptr;

      _Color_type _M_color;

      _Base_ptr _M_parent;

      _Base_ptr _M_left;

      _Base_ptr _M_right;

    static _Base_ptr _S_minimum(_Base_ptr __x)

    {

      while (__x->_M_left != 0) __x = __x->_M_left;

      return __x;

    }

    static _Base_ptr _S_maximum(_Base_ptr __x)

    {

      while (__x->_M_right != 0) __x = __x->_M_right;

      return __x;

    }

  };

template <class _Value>

struct _Rb_tree_node : public _Rb_tree_node_base

{

    typedef _Rb_tree_node<_Value>* _Link_type;

    _Value _M_value_field;

};

   ② 迭代器

  1、迭代器Iterators,用来在一个对象群集(collection of objects)的元素上进行遍历。这个对象群集或许是个容器,或许是容器的一部分。迭代器的主要好处是,为所有容器提供了一组很小的公共接口。迭代器以++进行累进,以*进行提领,因而它类似于指针,我们可以把它视为一种smart pointer
  2、比如++操作可以遍历至群集内的下一个元素。至于如何做到,取决于容器内部的数据组织形式。
  3、每种容器都提供了自己的迭代器,而这些迭代器能够了解容器内部的数据结构。

  ③ 算法

算法Algorithms,用来处理群集内的元素。它们可以出于不同的目的而搜寻、排序、修改、使用那些元素。通过迭代器的协助,我们可以只需编写一次算法,就可以将它应用于任意容器,这是因为所有的容器迭代器都提供一致的接口。

  ④ 适配器

  1、适配器是一种接口类

  为已有的类提供新的接口目的是简化、约束、使之安全、隐藏或者改变被修改类提供的服务集合

  2、三种类型的适配器:  

  容器适配器:用来扩展7种基本容器,它们和顺序容器相结合构成栈、队列和优先队列容器

  迭代器适配器(反向迭代器、插入迭代器、IO流迭代器)

  函数适配器(函数对象适配器、成员函数适配器、普通函数适配器)

  ⑤ 函数对象

  1、函数对象(function object)也称为仿函数(functor)
  2、一个行为类似函数的对象,它可以没有参数,也可以带有若干参数。
  3、任何重载了调用运算符operator()的类的对象都满足函数对象的特征
  4、函数对象可以把它称之为smart function。
  5、STL中也定义了一些标准的函数对象,如果以功能划分,可以分为算术运算、关系运算、逻辑运算三大类。为了调用这些标准函数对象,需要包含头文件<functional>。

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

三、STL提供六大组件,彼此可以嵌套使用

  1.容器:各种数据结构,比如vector,list,set,map,deque,用来存放数据。从实作的角度看,STL 容器是一种 class template。就体积而言,这一部份很像冰山在海面下的比率。

  2.算法:各种算法如sort,search,copy,erase。从实作的角度看,STL 算法是一种 function template。

  3.迭代器:扮演容器与算法的焦灼剂。剂,是所谓的「泛型指标」。共有五种类型,以及其它衍生变化。从实作的角度看,迭代器 是㆒种将 operator*, operator->, operator++, operator-- 等指标相 关操作予以多载化的 class template。所有 STL 容器都附带有自己专属的迭 代器 — 是的,只有容器设计者才知道如何巡访自己的元素。原生指标(native pointer)也是㆒种迭代器。

  4.仿函式:行为类似函式,可做为算法的某种策略(policy)。从实作的角度看,仿函式是㆒种重载了 operator()的 class 或 class template。㆒般函式指标可视为狭义的仿函式。

  5.配接器(adapters):一种用来修饰容器(containers)或仿函式(functors) 或迭代器(iterators)接口的东西。例如 STL 提供的 queue 和 stack,虽然看似容器,其实只能算是一种容器配接器,因为它们的底部完全借重 deque,所有动作都由底层的 deque 供应。改变 functor 接口者,称 为 function adapter,改变 container 接口者,称为 container adapter,改变 iterator 界面者,称为 iterator adapter。

  6.配置器(allocators):负责空间配置与管理。从实作的角度看, 配置器是一个实现了动态空间配置、空间管理、空间释放的 class template。

 

  STL 六大组件的交互关系:Container 透过 Allocator 取得数据储存空间,Algorithm 透过 Iterator 存取 Container 内容,Functor 可以协助 Algorithm 完成不同的策略变化,Adapter可以修饰或套接 Functor。

转自:https://blog.csdn.net/Simba888888/article/details/9410459

posted @ 2020-09-15 16:47  陈木  阅读(774)  评论(0)    收藏  举报