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 谢谢(其实我还是不太明白
10 个月之前 回复
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)
10 个月之前 回复
zhang_guyuan
zhang_guyuan   2017.09.19 14:29

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
深度搜索邻接矩阵深度搜索邻接矩阵
template <class T, class E> class Graph; template <class T, class E> class Graphmtx;
数据结构二叉树
用C++实现二叉树的数据结构 template <class T> class BiTree; template <class T> class BiNode //二叉树的结点结构 { friend class BiTree<T>; T data; BiNode<T> *lchild, *rchild; };
C++类模板 template <class T>
类模板与函数模板的定义和使用类似,我们已经进行了介绍,如果您对函数模板也感兴趣,请查看:。 有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类: class Compare_int{public : Compare(int a,int b) { x=a; y=b; } int max( ) { retu
C++中template<class T> && template <typename T>(模板区分)
问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不同?  template class Widget; // uses "class" template class Widget; // uses "typename"   答案:没什么不同。在声明一个 template type paramet
template关键字typename和class的区别,以及模板默认参数
template关键字typename和class的区别问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不同?template class Widget; // uses "class" template class Widget; // uses "typename"
模板声明中template <typename T>和template <class T>
在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 相信学习C++的人对class这个关键字都非常明白,class用于定义类,在模板引入c++后,最初定义模板的方法为: template......  在 这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了
模板 使用中注意的问题 template<class T>
from http://blog.sina.com.cn/s/blog_610c1cad01014gfo.html c++集合了过程式语言,通用语言,面向对象语言的众多特点。模板是通用语言的特性,模板又叫参数化类型(parametrized types)。 模板的定义。以下是模板定义的一般格式:   template //class 也可以换成typename,后
C++ - 类模板(class template) 详解 及 代码
类模板(class template) 详解 及 代码   本文地址: http://blog.csdn.net/caroline_wendy   类模板(class template)需要添加模板参数(template parameter), 即最前面添加"template <template T>"; 把所有需要使用模板类型的位置, 使用"T"代替; 使用时需要填加"Class"
C++ 模板template<class T>和template<typename T>有区别吗?
template和template都可以用来定义函数模板和类模板,在使用上,他们俩没有本质的区别。 在C++早期版本中,没有typename这个关键字,所以在模板定义的时候便使用了class。在C++后期的版本中,为了不再和class向混淆,所以加入了新的关键字typename用以区分。对于我个人而言,在定义模板函数时,更倡导使用typename关键字。 这里,顺便记录一下模板函数和模
C++类模板 template <class T>
类模板与函数模板的定义和使用类似。 有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类: class Compare_int{public : Compare(int a,int b) { x=a; y=b; } int max( ) { return (x>y)?x:y; } int min(