c++ 模板

冒泡排序

#include<stdio.h>

void Sort(int* arr,int len)
{
	for(int i=0;i<len-1;i++)
	{
		for(int j=0;j<len-1-i;j++)
		{
			if(arr[j]>arr[j+1])
			{
				int tmp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=tmp;
			}
		}
	}
}
void Print(int* arr,int len)
{
	for(int i=0;i<len;i++)
	{
		printf("%d ",arr[i]);
	}
}
int main()
{
	int arr[]={1,9,418,23,64};
	int len=sizeof(arr)/sizeof(arr[1]);
	Sort(arr,len);
	Print(arr,len);
	return 0;
}

折半查找

#include<stdio.h>

int Found(int* arr,int len,int num)
{
	int left,right,mid;
	left=0;
	right=len-1;
	mid=(left+right)/2;
	while(left<right)
	{
		if(arr[mid]>num)
		{
			right=mid-1;
			mid=(left+right)/2;
		}
		else if(arr[mid]<num)
		{
			left=mid+1;
			mid=(left+right)/2;
		}
		else
			return mid;
	}
}


int main()
{
	int arr[]={1,9,23,64,89};
	int len=sizeof(arr)/sizeof(arr[1]);
	printf("下标是:%d\n",Found(arr,len,89)+1);

	return 0;
}

1.模板

在前面的排序和查找代码中,我们的功能函数都是指定接收某一种类型来进行,如果我们需要创建一个可以接受任意数据类型的功能函数呢,应该怎么做?

在c++中我们可以通过模板的方式进行,通过模板,编译器可以帮我们枚举所有的类型。

如下:

在函数上端添加template<class A>,可在函数,结构体/类中使用

通过查看有无模板俩两者之间的反汇编代码,我们发现两者没有任何区别,在汇编中我们找不到模板的影子,因此我们可以得出总结:

继承是将父类的数据进行复制

模板是将代码进行复制,在编译时会编译器会根据我们传参的类型进行代码的复制

2.作业

1.使用模板实现swap(x,y)函数,功能:交换x,y的值

#include<stdio.h>
template <class A>
void Swap(A* x,A* y)
{
	int tmp=*x;
	*x=*y;
	*y=tmp;
}
int main()
{
	int x=22;
	int y=77;
	printf("x=%d  y=%d\n",x,y);
	Swap(&x,&y);
	printf("x=%d  y=%d\n",x,y);
	return 0;
}

2.实现冒泡排序结构体

#include<stdio.h>
struct Base
{
	int x;
	int y;
};
template <class A>
void Sort(A* arr,int len)
{
	for(int i=0;i<len-1;i++)
	{
		for(int j=0;j<len-1-i;j++)
		{
			if(arr[j]->x>arr[j+1]->x)
			{
				A tmp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=tmp;
			}
		}
	}
}
void Print(int* arr,int len)
{
	for(int i=0;i<len;i++)
	{
		printf("%d ",arr[i]);
	}
}
int main()
{
	Base a,b,c;
	a.x=3;
	b.x=2;
	c.x=1;
	Base* arr[3]={&a,&b,&c};
	Print((int*)arr,3);
	printf("\n");
	Sort(arr,3);
	Print((int*)arr,3);
	return 0;
}

我们发现,在普通数据类型进行比较时,比如int,char,short类型进行比较时,可以直接进行比较,但是在类或者结构体进行比较时,我们需要对类或者结构体的成员变量进行调用,因此在比较时不可以将其划分为template <class T>这种操作

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值