第一个函数模板的应用:
#include <stdio.h>
template <typename T> //也可以用template <class T>
T* find(T *first,T *last,T &value)
{
if(!first||!last)
return 0;
for(;first!=last;first++)
if(*first==value)
return first;
return 0;
}
void main()
{
int ia[8]={1,1,2,3,5,8,13,21};
double da[6]={1.5, 2.0, 2.5, 3.0, 3.5, 4.0};
int *pi = find(ia,ia+8,ia[3]);
double *pd = find(da,da+6,da[5]);
printf("int find : %d/n",*pi);
printf("double find : %f/n",*pd);
}
另一版:
#include <stdio.h>
template <typename T>
const T* find(const T *first,const T *last,T &value)
{
if(!first||!last)
return 0;
for(;first!=last;first++)
if(*first==value)
return first;
return 0;
}
void main()
{
int ia[8]={1,1,2,3,5,8,13,21};
double da[6]={1.5, 2.0, 2.5, 3.0, 3.5, 4.0};
const int *pi = find(ia,ia+8,ia[3]);
const double *pd = find(da,da+6,da[5]);
printf("int find : %d/n",*pi);
printf("double find : %f/n",*pd);
}
-------------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <vector>
using namespace std; //importent
template <typename T>
const T* find(const T *first,const T *last, const T &value)
{
if(!first||!last)
return 0;
for(;first!=last;first++)
if(*first==value)
return first;
return 0;
}
void main()
{
int ia[8]={1,1,2,3,5,8,13,21};
vector<int> ia_vec(ia,ia+8);
const int *pi_rev=find(&ia_vec,&ia_vec[ia_vec.size()],ia_vec[5]);
}
为什么老是出错,但是我将&ia_vec改成&ia_vec[0]就可以了?请教!!!
&ia_vec 指向的是一个vector对象,并不是其包含值的首地址。
&ia_vec[0]可以运行。因为[]已经被vector重载,返回其包含的元素,同时vector模板必须保证其内部值连续存放,所以&ia_vec[0]能运行。
ia_vec是vector<int>类型的对象~它的存储空间中的情况要比普通的数组ia复杂一些~
内部除了有关元素的存储信息外~还有一些数据成员呀,比如size什么的~
1。ia_vec并不能代表首地址,只是代表一个对象而已;
2。&ia_vec可以取得ia_vec存储空间的首地址~但是find函数要的是关于容器内元素的存储信息~
而&ia_vec[0]恰好可以取得ia_vec中所存储元素序列的首地址;