C++ 模板函数 007:排序,又见排序!

007:排序,又见排序!

描述
自己编写一个能对任何类型的数组进行排序的mysort函数模版。只能写一个mysort模板,不能写mysort函数!

#include <iostream>
using namespace std;

bool Greater2(int n1,int n2) 
{
	return n1 > n2;
}
bool Greater1(int n1,int n2) 
{
	return n1 < n2;
}
bool Greater3(double d1,double d2)
{
	return d1 < d2;
}

template <class T1,class T2>
void mysort(
// 在此处补充你的代码
#define NUM 5
int main()
{
    int an[NUM] = { 8,123,11,10,4 };
    mysort(an,an+NUM,Greater1); //从小到大排序 
    for( int i = 0;i < NUM; i ++ )
       cout << an[i] << ",";
    mysort(an,an+NUM,Greater2); //从大到小排序 
    cout << endl;
    for( int i = 0;i < NUM; i ++ )
        cout << an[i] << ","; 
    cout << endl;
    double d[6] = { 1.4,1.8,3.2,1.2,3.1,2.1};
    mysort(d+1,d+5,Greater3); //将数组从下标1到下标4从小到大排序 
    for( int i = 0;i < 6; i ++ )
         cout << d[i] << ","; 
	return 0;
}

输入

输出

4,8,10,11,123,
123,11,10,8,4,
1.4,1.2,1.8,3.1,3.2,2.1,

解题
构建模板函数——左开右闭
关键点
模板的类型——T为int * 的话,进行swap时无法利用模板T对temp变量定义类型,无法进行交换
故T必须为int,需在函数上写T *s。

template <class T1,class T2>
void mysort(T1 *s, T1 *e, T2 rule){        //T1需为int,不然没法完成swap 
	int size = e-s;
	for (int i=size-1;i>0;--i){  //右开,故e不算 
		for(int j=0;j<i;++j){
			if(rule(s[j+1],s[j])){   //不满足 
				T1 temp=s[j];      //auto 自动推断 
				s[j]=s[j+1];
				s[j+1]=temp;
			}
		}
	}
}

或者将swap写在外面,无需在函数内部构建临时变量,则可使T为int * 类型;

template<class T>
void Swap( T & a, T & b)
{
	T tmp;
	tmp = a;
	a = b;
	b = tmp;
}

template <class T1,class T2>
void mysort( T1  start , T1  end, T2 myless )    
{
	int size = end - start;
	for( int i = size -1;i >= 0 ; --i ) {
		for( int j = 0; j < i ; ++j ) {
			if(  myless( * ( start + j+1), * (start+j) )) {
				Swap(* ( start + j+1), * (start+j) );
			}
		}
	}
}

另一种办法,利用auto,自适应变量的类型;

template <class T1,class T2>
void mysort( T1  start , T1  end, T2 myless )
{
	int size = end - start;
	for( int i = size -1;i >= 0 ; --i ) {
		for( int j = 0; j < i ; ++j ) {
			if(  myless( * ( start + j+1), * (start+j) )) {
				auto tmp = * ( start+j);
				* ( start +j ) = * ( start + j+1);
				* ( start + j+1)  = tmp; 
			}
		}
	}
}

易错点
模板变量T 的类型要仔细核对,函数中T 和 T*要分清楚。

发布了77 篇原创文章 · 获赞 3 · 访问量 3052

猜你喜欢

转载自blog.csdn.net/BLUEsang/article/details/105177475
今日推荐