天天看点

重学c++(六)

一、泛型编程

1、如果说面向对象是一种通过间接层来调用函数,以换取一种抽象,那么泛型编程则是更直接的抽象,他不会因为间接层而损失效率;

  不同于面向对象的动态期多态,泛型编程是一种静态器多态,通过编译器生成最直接的代码;

  泛型编程可以将算法与特定类型、结构剥离,尽可能复用代码。

2、例子

template<int n>
struct Sum
{
    enum Value{N = Sum<n-1>::N+n};

};
template<>
struct Sum<1>
{
    enum Value{N = 1};
};

int main()
{ 
    cout << Sum<100>::N << endl;

    return 0;
}      

 二、STL(Standard Template Library)

1、STL算法是泛型的,不与任何特定数据结构和对象绑定,不必在环境类似的情况下重写代码;

  STL算法可以量身定做,并且具有很高的效率;

  STL可以进行扩充,可以编写自己的组件并且能与STL标准的组件进行很好的

2、总体

重学c++(六)

3、1)序列式容器(其中元素是可排序的;vector list deque;而stack queue priority_queue是容器适配器)

struct Display 
{
    void operator()(int i)
    {
        cout << i << " ";
    }
};

........

int iArr[] = { 1,2,3,4,5 };
vector<int>iVector(iArr, iArr + 4);
for_each(iVector.begin(), iVector.end(), Display());      

   2)关联式容器(每个数据元素都是由一个键key和值value组成,当元素被插入到容器时,按其键以某种特定规则放入适当位置;set multiset map multimap)

//c++一般实现
bool MySort(int a, int b)
{
    return a < b;
}
void Display(int a)
{
    cout << a << " ";
}
//c++泛型实现
template<typename T>
bool MySortT(T const& a, T const& b)
{
    return a < b;
}
template<typename T>
inline void DisplayT(T const& a)
{
    cout << a << " ";
}
//c++仿函数实现
struct SortF
{
    bool operator()(int a, int b)
    {
        return a < b;
    }
};
struct DisplayF
{
    void operator()(int a) {
        cout << a << " ";
    }
};
//c++仿函数模板实现
template<typename T>
struct SortFT
{
    inline bool operator()(T const& a, T const& b) const
    {
        return a < b;
    }
};
template<typename T>
struct DisplayFT
{
    inline void operator()(T const& a) const
    {
        cout << a << " ";
    }
};

int main()
{ 
    //c++一般方式
    int arr1[] = { 4,1,3,2,7 };
    sort(arr1, arr1 + 5, MySort);
    for_each(arr1, arr1 + 5, Display);
    cout << endl;

    //c++泛型
    int arr2[] = { 4,1,3,2,7 };
    sort(arr2, arr2 + 5, MySortT<int>);
    for_each(arr2, arr2 + 5, DisplayT<int>);
    cout << endl;

    //c++仿函数
    int arr3[] = { 4,1,3,2,7 };
    sort(arr3, arr3 + 5, SortF());
    for_each(arr3, arr3 + 5, DisplayF());
    cout << endl;

    //c++仿函数末模板
    int arr4[] = { 4,1,3,2,7 };
    sort(arr4, arr4 + 5, SortFT<int>());
    for_each(arr4, arr4 + 5, DisplayFT<int>());
    cout << endl;


    return 0;
}      

继续阅读