0%

站在编程范式的角度理解STL核心模块之间的关系

2020年5月17日 下午9:21

我理解的STL的宏观设计:

  1. 层次话的结构图:在<STL源码剖析>中作者是扁平化的图P6
  2. 要上升一个层次,从编程范式的本质角度去理解STL的设计、各个组件之间的逻辑关系
    1. 首先,需要理解编程范式的本质是做到control、logic、data的分离
      1. 理解control、logic、data、泛型、函数式编程
      2. 编程范式理解
    2. 站在这个角度:
      1. algorithm ==> control
      2. Functor == > logic
      3. Container == > data
    3. iterator 是Container 的一部分,也就是说iterator == data:
      1. Container 提供 iterator,因为Container最清楚iterator的操作,所以在编程实现的时候,iterator是作为Container的内部类来实现的
    4. 总结:
      1. STL可以说是编程范式在C++这门语言的最佳实践,它完美的达到了编程范式所追求的control、logic、data的分离。
      2. 当我们需要设计一个control、logic、data的分离的项目功能的时候,就需要把STL作为参考,尤其时候在C++下,STL就告诉了我们应该如何利用C++语言的特性 + 合适的设计,来达到control、logic、data的分离分离
    5. 这部分在使用STL的时候,也可以看出来:
      1. 里有用的函数

为什么需要iterator_traits,没有iterator_traits的五种特性会怎样

  1. 我们知道五种特性,其实都是为了说明当前容器对应的类型
    1. 前四种类型:元素类型、距离类型、指针类型与reference类型
      1. 如果iterator不提供类型这前四种,那么iterator的上层algorithm,就无法做到泛型。
      2. 证明在 模板编程:对循环for分步骤STL如何实现泛型
    2. 而第五种类型:迭代器类型
      1. 为了algorithm层次可以根据迭代器类型做重载函数的设计,来区别五种不同的迭代器(P92-<STL源码剖析>)
  2. 核心本质:没有iterator_traits,做不到泛型!上层无法获得下层数据对象的类型,因此,下层应该给上层留出接口,能够上上层自己获取。
  3. 在Traits中可以引申出一个重要的语法点typename:
    1. [摘抄]C++ typename的起源与用法
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      //!!! 自定义迭代器必须提供iterator_traits的五种特性,分别是迭代器类型、元素类型、距离类型、指针类型与reference类型!!!
      //template<class Iterator>
      //struct iterator_traits
      //{
      // typedef typename Iterator::difference_type difference_type;
      // typedef typename Iterator::value_type value_type;
      // typedef typename Iterator::pointer pointer;
      // typedef typename Iterator::reference reference;
      // typedef typename Iterator::iterator_category iterator_category;
      //};