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;
}

 

 

posted @ 2012-04-21 11:16  w0w0  阅读(155)  评论(0编辑  收藏  举报