2020年5月17日 下午9:21
我理解的STL的宏观设计:
- 层次话的结构图:在<STL源码剖析>中作者是扁平化的图P6

- 要上升一个层次,从编程范式的本质角度去理解STL的设计、各个组件之间的逻辑关系
- 首先,需要理解编程范式的本质是做到control、logic、data的分离
- 站在这个角度:
- algorithm ==> control
- Functor == > logic
- Container == > data
- iterator 是Container 的一部分,也就是说iterator == data:
- Container 提供 iterator,因为Container最清楚iterator的操作,所以在编程实现的时候,iterator是作为Container的内部类来实现的
- 总结:
- STL可以说是编程范式在C++这门语言的最佳实践,它完美的达到了编程范式所追求的control、logic、data的分离。
- 当我们需要设计一个control、logic、data的分离的项目功能的时候,就需要把STL作为参考,尤其时候在C++下,STL就告诉了我们应该如何利用C++语言的特性 + 合适的设计,来达到control、logic、data的分离分离
- 这部分在使用STL的时候,也可以看出来:
为什么需要iterator_traits,没有iterator_traits的五种特性会怎样
- 我们知道五种特性,其实都是为了说明当前容器对应的类型;
- 前四种类型:元素类型、距离类型、指针类型与reference类型
- 如果iterator不提供类型这前四种,那么iterator的上层algorithm,就无法做到泛型。
- 证明在 模板编程:对循环for分步骤STL如何实现泛型
- 而第五种类型:迭代器类型
- 为了algorithm层次可以根据迭代器类型做重载函数的设计,来区别五种不同的迭代器(P92-<STL源码剖析>)
- 前四种类型:元素类型、距离类型、指针类型与reference类型
- 核心本质:没有iterator_traits,做不到泛型!上层无法获得下层数据对象的类型,因此,下层应该给上层留出接口,能够上上层自己获取。
- 在Traits中可以引申出一个重要的语法点typename:
- [摘抄]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;
//};
- [摘抄]C++ typename的起源与用法