2 doctor msor doctor_msor 于 2017.09.17 09:26 提问

二分查找template<class T>做了什么?

写了个二分查找函数如下:
template
int BinSearch(T& array,int target){
int low=0,high=sizeof(array)/sizeof(array[0])-1;

while(low<=high){
if(array[low]==target)
return low;
if(array[high]==target)
return high;
int mid=low+(high-low)/2;
if(array[mid]==target)
return mid;
if(array[mid] low=mid+1;
else
high=mid-1;
}
return -1;
}
第一行和第二行如果写成
int BinSearch(int array[],int target)
那么传进来的就是array的指针,导致high计算错误
但是不明白模板template做了什么,让原来的array作为引用传进去了
如果用int& array[]就不行,提示的是不能引用数组
如果不用template怎么写呢?

3个回答

u010904759
u010904759   2017.09.17 09:40

template 是模块,template是声明一个模板类T, 然而函数的声明int BinSearch(T& array,int target) 这里的T就是模块类T,是使整个函数都通用。
T代表所有类型。其它其实方式不能很好实现操作函数(类型)通用

doctor_msor
doctor_msor 谢谢(其实我还是不太明白
2 个月之前 回复
a996627519
a996627519   2017.09.17 20:52

如楼上所说,template是模板,尖括号里面的T是你在使用的时候指定的类型,比如说你在main函数里面调用BinSearch(a,b)
其中,a是什么类型,那么那个T就是什么类型,看不懂没关系,我来给你举个例子

int a[10]={1,2,3,4,5,6,7,8,9,10};
BinSearch(a,5);
模板参数和函数参数对于数组传入机制不一样,在这里a是作为一个int 型的a[10]数组传入,也就是说

T的类型是int a[10]类型的,注意,是整个int a[10]作为类型,所以传入的a是一个完整的数组,所以可以用sizeof(a),sizeof(a[0])等,但是

当a也就是数组作为一般函数参数传入函数时,数组会退化为指针,没错是变成了指针,那么sizeof(a)是一个指针的长度,这样一说问题

就迎刃而解了,你说用 int &array[]就不行,那是因为如果用int BinSearch(int& array[],int target),那么a就是以一个指针传入,指针的

引用太荒谬了。

不懂再问

a996627519
a996627519 如果你不想用template的话,那你只能手动传入一个表明数组长度的值,比如 int BinSearch(int array[],int length,int target)
2 个月之前 回复
zhang_guyuan
zhang_guyuan   2017.09.19 14:29

template是为了解决一类问题而不是某一个问题,假如按照你的设想那么它只能解决int类型的二分查找

Csdn user default icon
上传中...
上传图片
插入图片