之前一段时间听了侯捷老师来学校的课程,感觉学了很多东西,现在整理两篇笔记上来
什么是STL
STL(standard template library)标准模板库。是一个令所有开发者兴奋的工具和组件的集合。现在,STL是C++的一部分,被内建在编译器内,但是不同的编译器对于STL的实现有些地方是不同的。template 是实现范型的一种C++语法,它依赖于用户提供的type,并在编译阶段实现。范型编程和OO面向对象编程是完全相反的理念。因为,OO是将行为封装在类里面。而范型编程却是,假如有很多个类,它们具备一些相同或者相似的行为,只是这些行为可能会依赖于这个类。我们就将这些相似的行为给提取出来,用统一的手段进行处理。而用户在使用时,就提供需要处理的类型,这样就是所谓的范型了。
template又分为三种
- class template:类模板,带有模板的类
- function template:函数模板,带有模板的函数
- member template:成员模板,带有模板的成员变量
STL的六大组件
- Container 容器,vector,list等都是容器
- Algorithm 算法,排序,比较等
- Functor(Function Object) 函数对象
- Iterator 迭代器
- Adapter 适配器
- Allocator 分配器,分配器为container分配内存
Function Object
Function Object 是行为像function的object。用代码比较好理解。
1
2
3
4
5
6
7
8
9
10
11
|
template
struct
Functor{
T operator()(T a,T b){
return
a<b;
}
};
int
main(){
Functor f1;
cout<<f1(3,5);
}
|
这里明明f1是一个struct对象,为什么我们像却这样使用它呢?其实很简单,因为我们在struct中对functor的括号”()”进行了重载,所以我们可以这样进行使用它。这样做的目的很明显,苹果在Objective-C中加入了block的机制,block其实就是function object。目的都是为了对函数进行传递。使我们在这个类中定义的一个函数,然后另外一个类来使用它。block在OC中通常作为回调使用。
容器
STL中有各种数据结构的容器。其中主要分为两类,一种为顺序容器,一种为关联容器。
顺序容器:
- 数组 array:C++内建,而不是STL中的
- vector:连续存储空间
- heap:堆,以算法形式呈现
- priority-queue:优先队列
- list:双向链表
- slist:单向链表
- deque:双向队列
- stack:栈,容器适配器,由deque用适配器模式构造而成
- queue:队列,容器适配器,由deque用适配器模式构造而成
关联容器:
- RB-tree
- set
- map
- multiset
- multimap
- hashtable
- hash_set
- hash_map
- hash_multiset
- hash_multimap