六大部件
1.容器
我们常常说程序=数据结构+算法,其实容器就是数据结构,常用的容器有sequence containers:array,vector,list,deque,还有associative container:set,map等。每个容器在使用之前都请添加头文件,在定义时的语言风格有点类似模板,因为STL的底层实现与c++的泛型编程息息相关,关于具体的用法可以参考cplusplus.com中的rederence或者其他网站去。
2.算法
STL针对每个容器有非常多对应的算法,如与排序查找有关的快速排序,二分查找等都有,可以直接调用。很奇怪的一点是c++面向对象的思想在这里几乎被遗弃了,我们常常把数据和函数封装到一个类里面,但在这里算法和容器分开了。
3.迭代器
如上图所示迭代器是算法操纵容器的手段,有点像指针,当然也能完全这样理解,用*号解引用后能直接得到具体的数据,也能完成指针的几乎所有的操作如++等。
4.分配器
用来分配管理内存空间,可以想象成是一个内存池,在使用容器时,我们可以对内存空间进行动态分配,当然如果我们不使用容器时分配内存用new和malloc就可以了,allocator在使用上面还是过于麻烦了要先allocate(给予对象个数)然后还要construct,destroy,deallocate。我们在使用容器时也往往使用默认的分配(容器模板第二个参数),比如vector,应该没有人会写vector<int,allocator>吧,不会吧不会吧(doge)。
5.仿函数
仿函数,仿函数,就是很像函数的一个东西,我们平常在使用时直接当成内置函数用就好,STL为我们提供了丰富的仿函数plus,minus,for_each,multiplies,divides,modulus,equal_to,not_equal_to,greater等等,但其实它并不是一个函数而是一个重载了()的一个类
6.适配器(容器,仿函数)
”适配器是使一种事物的行为类似于另外一种事物行为的一种机制”这句话非常常见,我的理解是它可以对容器或者仿函数进行包装使它表现出其他的功能,下面会给例子。容器适配器有queue,priority_queue,stack。
总结
最后以侯捷先生的一个例子来结束——
#include<vector>
#include<algorithm>
#include<functional>
#include<iostream>
using namespace std
int main()
{
int ia[6]={1,2,3,4,5,6};
//容器初始化
vector<int,allocator<int>> vi(ia,ia+6);
//count_if是算法,vi.begin()是迭代器,not1,bind2nd是适配器,less是仿函数
//功能是统计大于4的数量
cout<<count_if(vi.begin(),vi.end(),not1(bind2nd(less<int>(),4)));
return 0;