几个泛型编程算法

泛型编程指在程序中利用设计模式中的迭代器类型对算法操作的对象进行编程,在某种程度上说,迭代器和指针有某种相似处。实际上,Stroustrup 认为凡是具有迭代器功能的就是迭代器。这里采用指针来作为函数的参数来作为泛型编程,也算是一种的方法吧! 有点借鉴候捷先生

//1. 交换算法 swap

template<typename T> void f_swap(T* p_a, T* p_b)
{
    T t;
    t = *p_a;
    *p_a = *p_b;
    *p_b = t;
}

//2. 查找算法 find

template<typename T>T * f_find(T* p_begin, T* p_end, T t_value)
{
       while(p_begin != p_end&& *p_begin != t_value)
              ++p_begin;
       return p_begin;
}


//3. 复制: 将p_end指向的内容复制到 p_begin的空间

template<typename T> bool f_copy(T* p_begin, T* p_end, size_t n)
{

       //if(p_begin>p_end)  
       // return false;
       //or assert(p_begin < p_end)
       for(int i=0; i<n; i++)
           *p_begin = *p_end;
        return true;
}

//4. 累加 accumulate

template<typename T> T f_accumulate(T* p_begin, T* p_end, T t_value )
{
       for(;p_begin!=p_end;++p_begin)
           t_value = t_value+*p_begin;
        return t_value;
}
//* 一定提供一个初值value这样,即使p_begin和p_end之间为空,任能够获得一个确定的值。

//5. 快速排序

template<typename T > T* f_partion(T* p_begin, T* p_end)
{
    T* p_free = p_begin ;
    T* p_step = p_begin;
    for( ; p_free!=p_end+1; p_free++ )
    {
        if(*p_begin>*p_free)
             f_swap(p_step
++, p_free);
    }
    if(*p_begin>*p_step)
        swap(p_begin,p_step);
    return p_step;

}

template<typename T > void f_quicksort(T* p_begin, T* p_end)
{
    T* p_pivot;
    if(p_begin<p_end)
    {
        p_pivot = f_partion(p_begin, p_end);
        f_quicksort(p_begin, p_pivot-1);
        f_quicksort(p_pivot+1, p_end);
    }
}

 

//6.计算差值
/*这是我自己的一个算法,侯捷先生的STL源码更先进*/
template<typename T> void f_adjacent_difference(T* begin, T* end)
{
    T tmp_1, tmp_2;
    T* ptr = begin;
    tmp_1 = *begin;
    while(ptr!=end)
    {
        ptr++;
        tmp_2 = *ptr;
        *ptr = *ptr - tmp_1;
        tmp_1 = tmp_2;
    } 
}

//7.binary_search
/*辅助函数 T* get_mid(T* begin , T* end) //获得begin 和 end 指针中间的指针
 */
template<typename T> T* f_binary_search<T* begin , T* end, T val>
{

   if(begin!=end) return NULL;
   T* p=get_mid(begin, end);
   if(val==*p)
        return p;//指向查找到的元素
   else if (val>*p)
        return f_binary_search(p+1, end, val);
   else if (val<*p)
        return f_binary_search(begin, p-1, val); 

}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值