关于函数模板的笔记

第一个函数模板的应用:

#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中所存储元素序列的首地址;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值