STL源码剖析学习一:概论
STL源码剖析学习一:概论
STL所实现的,是依据泛型思维架设起来的一个概念结构。这个以抽象概为主体而非以实际类为主体的结构,形成一个严谨的接口标准。在此接口之下,任何组件都有最大的独立性,并以迭代器胶合起来,或者以配接器互相连接,或者用仿函数动态选择某种策略。
六大组件:
1.容器:各种数据结构
2.算法
3.迭代器:容器和算法之间的胶合剂 是“泛型指针”
4.仿函数:行为类似函数,可以作为算法的某种策略
5.配接器:修饰容器或者仿函数或者迭代器接口的东西
6.配置器:负责空间配置和动态管理
语法要点:
1.静态常量可以在class内部直接初始化
一般的变量都是不能在class内部直接初始化的,即使是常量也不行
常量初始化的方法是在构造函数的初始化列表中,或者是拷贝构造函数的初始化列表中
只有static const修饰的变量才可以在类内部直接初始化
#include<iostream> using namespace std; class A{ public: //const int a = 10; const int a; int b; //static int c = 3; static int c; const static int d = 4; A():a(1) { c = 3; b = 2; //a=10; } }; int A::c=3; int main() { A aa; cout<<aa.a<<endl<<aa.b<<endl<<aa.c<<endl<<aa.d<<endl; }
2.前闭后开的区间表示
STL算法中需要一对迭代器所表示的区间,用来表示操作范围
这一对迭代器用前闭后开的区间来表示[first,last)
迭代器last指向最后一个元素的下一个位置
3.operator()操作符的重载
想要将函数当做参数来传递,唯一的方式是通过函数指针,但是函数指针不能持有自己的状态(局部状态),也不能达到组件的适配性--无法再将某些装饰条件加到上面而改变其状态
所以STL中的“一整组操作”都用仿函数来实现
对class进行operator()重载,他就成为一个仿函数。
#include<iostream> using namespace std; class func{ public: int m; func(int num) { m = num; } void operator()(int &n)const { n = m*n; } }; class show{ public: void operator()(int n) { cout<<n<<endl; } }; int main() { int a[] = {1,2,3,4,1,2,3}; int len = sizeof(a)/sizeof(int); func f1 = 10; for_each(a,a+len,f1); for_each(a,a+len,show()); cout<<endl; func f2 = 20; for_each(a,a+len,f2); for_each(a,a+len,show()); cout<<endl; }