一。STL六大组件
1.容器(container),各种数据结构: vector, deque, list, forward_list, array, set, multiset, map, multimap, unordered_set, unordered_multiset,
unordered_map, unordered_multimap. 从实现的角度来讲,STL容器是一种class template。
2.算法( algorithm),各种算法例如: sort, search, earse, copy。从实现角度来说,算法是一种function template.
3.迭代器(iterator)容器和算法之间的粘合剂,是所谓的“泛型指针”,从实现的角度迭代器是一种将 operator*, operator->, operator++, operator--
等指针相关操作重载的一种class template。
4.仿函数(functor)行为类似函数,可作为某种算法的策略(policy),从实现的角度来讲是一种重载的operator()的class或者 class template。
5.适配器(adapter) 一种用来修饰容器(container),或者仿函数(functor),或者迭代器(iterator)接口的东西。例如STL提供的queue和stack
虽然看似容器,但是只是一种容器适配器。因为他们底层完全借助于deque,所有操作都是由底层的deque供应。改变functor接口,称为functor adapter。
改变container接口,称为container adapter。改变iterator接口,称为iterator adapter。
6.配置器(allocator):负责空间和内存的配置和管理。从实现角度来讲。配置器是实现动态内存分配和内存释放的class template。
1.container从allocator那里分配内存空间,储存数据。Algorithm通过iterator连接container。functor辅助algorithm完成不同策略变化,adapter修饰各种接口。
template <class Type>
关键字template告诉编译器,将要定义个模板。尖括号中的内容相当于函数的参数列表。把关键字class看作变量的类型名,该变量接受类型作为其值
把Type看作该变量的名称。通用类型标识符----例如这里的Type----称为类型参数(type parameter),这意味着它们类似于变量,但赋给它们的不能是数
字,而只能是类型。
STL里面有什么呢?
容器(data)和算法(operates on data that in containers)。面向对象语言是结合数据和算法到一个类中,这个类的实例被称为对象。但STL和
面向对象语言不同,它分开数据和算法,这样做的目的是代码重用。
正常情况下,如果我们有N个容器,M个算法。M个算法运用到N个容器中,共有N*M种实现(每一个容器都要实现M种算法)。为了解决这个问题
STL提供了另外一类组件,迭代器(iterators)。每一种容器都必须提供给迭代器定义的公共接口。
迭代器能在容器中迭代每一项。所以算法不用直接作用于容器,而可以作用于迭代器。所以算法不用知道容器,只用知道容器中的迭代器就够了。
这极大的提升了代码重用,原来是N*M种实现,而现在只需要N+M种实现。这种结构的另外一种好处是极易拓展,如果定义了新的一种算法,能够作用
于迭代器,那么这种算法适用于已经存在的所有容器。如果定义了一个新的容器(容器提供了迭代器的接口),那么容器能都运用现存的所有算法。
正如你看到的STL多么能够重用。但是这些重用是有代价的,因为STL不是很容易使用,里面有很多陷阱。
2.使用STL的原因:
1.代码重用,不用重新造轮子。
2.高效。现代c++编译器都优化了STL代码。
3.精确,比较少的bug。
4.简洁易懂的代码,能够减少控制流。
5.能够深刻理解数据结构和算法。