C++泛型算法

来源:互联网 发布:赤峰办公软件速成班 编辑:程序博客网 时间:2024/05/22 13:49

泛型算法=模板+迭代器

问题:

首先我们利用随机数,然后对这些随机数从小到大排序。
vector 还是使用我们自定义的vector,参加《vector第四步修炼之道》博文。
测试函数:

#include<iostream>#include<time.h>//#include "vectorAllocate.h"//#include "vectorAllocateIterator.h"#include "vectorjGenericity.h"using namespace std;int main(){    /***********vectorjGenericity的使用*************/    myAllocator<int> alloc;    vector<int, myAllocator<int>> vec1(10, alloc);    srand(time(NULL));    for (int i = 0; i < 20; i++)    {        vec1.push_back(rand()%100);    }    showContainer<vector<int, myAllocator<int>>>(vec1);    return 0;}

然后写从小到大排序函数,算法使用冒泡排序

//默认从小到大,把[first,last]区间的所有元素从小到大排序template<typename Iterator>void mySort(Iterator it1, Iterator it2){    Iterator::value_type tmp;    int size = it2 - it1;    for (int i = 0; i < size; ++i)    {        for (int j = 0;j < size - i - 1;++j)        {            if (it1[j]>it1[j + 1])            {                tmp = it1[j];                it1[j] = it1[j + 1];                it1[j + 1] = tmp;            }        }    }};

调用函数

mySort(vec1.begin(),vec1.end());

如果此时我需要从大到小呢?是不是需要重新定义一个函数?好麻烦~

优化1

如果我分别定义从大到小的函数和从小到大的函数,然后在排序函数中使用函数指针呢?

//函数定义template <typename T> bool mygreater(T a, T b){    return a > b;}template <typename T>bool myless(T a, T b){    return a < b;};

mySort函数实现

 //默认从小到大,把[first,last]区间的所有元素从小到大排序template<typename Iterator,typename Compare>void mySort(Iterator it1, Iterator it2, Compare func) {     Iterator::value_type tmp;     int size = it2 - it1;     for (int i = 0; i < size; ++i)     {         for (int j = 0;j < size - i - 1;++j)         {             if (func(it1[j],it1[j + 1]))               {                 tmp = it1[j];                 it1[j] = it1[j + 1];                 it1[j + 1] = tmp;             }         }     } }

测试函数

    mySort(vec1.begin(), vec1.end(), mygreater<int>);    mySort(vec1.begin(), vec1.end(), myless<int>);

优化2

如果定义成函数模板,那可以转化成模板类吗?当然可以。

(func(it1[j],it1[j + 1]))   ==》func.operator(it1[j],it1[j + 1])

模板类定义如下:

//模板类定义template <typename T>class mygreater {public:    bool operator()(T a, T b)    {        return a > b;    }};template <typename T>class myless{public:    bool operator()(T a, T b)    {        return a < b;    }};

mySort函数实现

template<typename Iterator,typename Compare>void mySort(Iterator it1, Iterator it2, Compare func) {     Iterator::value_type tmp;     int size = it2 - it1;     for (int i = 0; i < size; ++i)     {         for (int j = 0;j < size - i - 1;++j)         {             if (func.operator()(it1[j], it1[j+1]))                {              tmp = it1[j];              it1[j] = it1[j + 1];              it1[j + 1] = tmp;             }         }     } }

测试函数:

    mySort(vec1.begin(), vec1.end(), mygreater<int>());    mySort(vec1.begin(), vec1.end(), myless<int>());

STL 库中如何使用还需要看源码来分析,有时间了就琢磨下。