STL
1 | <iterator> <functional> <vector> <deque> |
- 6大部件:
STL可分为容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函数(functors)六个部分。
最常用的是容器和算法,在使用算法时,不需要考虑内存的分配与释放,这是由分配器完成的,算法通过迭代器操作于容器。
迭代器时前闭后开区间,[),.end()指向最后一个元素下一个元素,迭代器是泛化的指针。
容器分类
- 序列式的:
- 关联式容器:可用来快速查找,红黑树实现,set,map,multiset,multimap
- 不定序容器:也可以认为是关联式的,unordered_set/unordered_map/unordered_multiset/unordered_multimap/
如果标准库自己提供sort,优先用自己的。
- slist: include<ext\slist>和forward list相同,forward list是标准库中的,slist是早期的
deque
分段连续,前后可扩充。
模板
模板优缺点
面向对象是数据和方法放一起。
泛型是数据和方法分开。(通过接口传数据,如algorithm中的迭代器)
模板分类
- 函数模板:调用时可以不显示指定类型,模板可以重载
- 类模板:必须显示指定类型
- 成员模板(不常用)
类模板里面有全特化和偏特化
偏特化有个数上的偏,也有范围上的偏
全特化,为指定类型执行特殊的程序,优化算法。
注意开头是
1 | template<> |
偏特化
默认的分配器allocator
也可以自定义
容器 分类
迭代器的设计原则
iterator_traits 萃取
iterator有5种associated types相当于迭代器的属性,想用迭代器时使用方法要根据迭代器的这几个特性设计,如algorithm调用迭代器时需要知道这些特性。
iterator_category 单双向
value_type 容器的值类型
pointer 暂时未用
reference 暂时未用
difference_type 用来表示两个迭代器之间的距离
algorithm如果传进来的是指针(退化的迭代器)
则通过偏特化让算法知道这是指针。