STL体系结构基础介绍
1,首选来明确学习STL的目标,分为四个阶段:
第一阶段:使用C++标准库 第二阶段:认识C++标准库(胸中自由丘壑) 第三阶段:良好的使用C++标准库
第四阶段: 扩展C++标准库
一般来讲,达到第三种标准已经是很不错的programer了。
2,STL的六大部件:容器,分配器,算法,迭代器,适配器,仿函数。
容器用来存放数据,非常好的是把内存的问题全部解决掉,程序员在使用容器的时候看不到内存的东西,而不要管内存的东西。所以背后需要有另一个东西的支持——分配器。容器是一个Class,有一些操作是在容器本身做的,但是有一些模板函数被独立出来——算法。算法处理容器中的数据时需要另一种部件——迭代器(一种泛化的指针)。仿函数的作用是一个函数,比如要把两个东西加减,就可以写一个仿函数。适配器的作用就相当于变压器,可以起到转换的作用。可以对容器做转换,对迭代器做转换,以及对仿函数做转换。
3,各部件使用的示例:
代码中如果不写分配器时,会有默认的分配器。但是需要注意的是,如果指定分配器的时候,分配器中的内容要和容器的类型匹配。程序中,less是仿函数,作用是比较a和b的大小,通过适配器bind2nd绑定第二参数,达到每个元素与40比较的效果。not1也是一个适配器,取反之后的就是>=40。
4,STL中规定,所有容器的迭代器的degin()返回的是第一数据的地址,end()返回的是最后一个元素的下一个地址(即左闭右开区间)。容器遍历的方法之一如下:
Container<T> c;
...//让容器中放数据
Container<T>::iterator ite = c.begin();//定义一个容器的迭代器
for(; ite != c.end(); ++ite)
上面遍历容器的方法是老式的,在C++11中提供了范围for,语法如下:
for(decl : coll){}//coll是容器,decl是变量的名字
std::vector<double> vec;
for(double elem : vec){ std::cout << elem << std::endl;}//这样就可以一次打印vec中的各个元素