C++----------------->C++模板

ZZ:http://blog.sina.com.cn/s/blog_4aa0943f0100ce8k.html

C++模板

▌模板(template)——泛型编程

①函数模板(function template)

★定义:C++提供了一种方法,只写一个通用的函数,用通用的未实例化的类型来当参数类型。这个通用参数是在函数被调用的时候才实例化的,这个通用的函数就叫做函数模板。
例:
 int main()
{
 const int max=5;
 int iArray[max]={10, 20, 30, 40, 50};
 float fArray[max]={1.1, 1.2, 1.3, 1.4,1.5};
 char* cArray[max]={"one", "two", "three", "four","five"};
 
 for (int i=0; i<max; i++)
 {cout<<iArray[i]<<",";}
 cout<<"\n";
 for (i=0; i<max; i++)
 {cout<<fArray[i]<<",";}
 cout<<"\n";
 for(i=0; i<max; i++)
 {cout<<cArray[i]<<",";}
 
 return 0;
}
把for循环嵌入函数中:
void printArray(int* array, int size){
 for (int i=0; i<size; i++){
  cout<<array[i];
  if(i<(size-1)){
   cout<<",";
   }
  }
 }
 
void printArray(float* array, int size){
 for (int i=0; i<size; i++){
  cout<<array[i];
  if(i<(size-1)){
   cout<<",";
   }
  }
 }
 
void printArray(char** array, int size){
 for (int i=0; i<size; i++){
  cout<<array[i];
  if(i<(size-1)){
   cout<<",";
   }
  }
 }
for循环嵌入函数后的main函数:
main()
{
 const int max=5;
 int iArray[max]={10,20,30,40,50};
 float fArray[max]={1.1, 1.2, 1.3, 1.4,1.5};
 char* cArray[max]={"one", "two", "three", "four","five"};
 
 printArray(iArray, max);
 cout<<endl;
 
 printArray(fArray, max);
 cout<<endl;
 
 printArray(cArray, max);
 cout<<endl;
 
 return 0;
}
★为了避免上面这种复杂的形式,C++提供了一个模板结构,以参数化的形式来定义一个函数或者类。
例:(模板)
template<class T>
void printArray(T* array, int size){
 for(int i=0; i<size; i++){
  cout<<array[i];
  if(i<(size-1)){cout<<",";}
  }
 }
main()
{
 const int max=5;
 int iArray[max]={10,20,30,40,50};
 float fArray[max]={1.1, 1.2, 1.3, 1.4,1.5};
 char* cArray[max]={"one", "two", "three", "four","five"};
 
 printArray(iArray, max);
 cout<<endl;
 
 printArray(fArray, max);
 cout<<endl;
 
 printArray(cArray, max);
 cout<<endl;
 
 return 0;
}


②类模板(class template)

★例:
#include <iostream>
#include <string>
using namespace std;

template <classT> //写法等同于:template<typenameT>;
class Stack //创建一个栈的类;
{
public:
 Stack(int=10);
 ~Stack(){delete [] stackPtr;}
 int push(constT&);   //压栈;
 intpop(T&);  //弹栈;
 int isEmpty() const {returntop==-1;} //判断栈空,top=0指向第一个元素,top=-1则表示没有元素;
 int isFull() const {return top==size-1;} //栈满;
 void printOn(ostream &output); //“这句显得很垃圾”;
private:
 intsize;  //栈的大小;
 inttop;  //栈顶;
 T* stackPtr; //栈的指针;
};

template<class T>
Stack<T>::Stack(int s)
{
 size=s>0&& s<1000 ?s:10; //s>0&& s<1000 ?s:10赋值给size;
 top=-1;   //表示“一个元素都没有”
 stackPtr=new T[size];
}

template<class T>
voidStack<T>::printOn(ostream&output)
{
output<<"stack ( ";
for (int i=0; i<=top; i++)
{
 output<<stackPtr[i]<<",";
}
output<<" )\n";
}

template<class T>
int Stack<T>::push(constT& item)
{
if (!isFull())
{
 stackPtr[++top]=item;
 return 1;
}
return 0;
}

template<class T>
int Stack<T>::pop(T&item)
{
if (!isEmpty())
{
 item=stackPtr[top--];
 return 1;
}
return 0;
}

int main()
{
 int i;
 Stack<int>stack1;
 for(i=0; i<5; i++)
 {
  stack1.push(i*10);
  stack1.printOn(cout);
 }

 Stack<float>stack2;
 for (i=0; i<5; i++)
 {
  stack2.push(i*1.1);
  stack2.printOn(cout);
 }

 char* cArray[5]={"one", "two", "three","four", "five"};
 Stack<char*>stack3;
 for(i=0; i<5; i++)
 {
  stack3.push(cArray[i]);
  stack3.printOn(cout);
 }

 return 0;
}


★在实例化的时候可以给通用类型赋一个默认类型。

template<classT=int> //T可以缺省赋值,声明变量的时候,缺省赋值可以去掉<>.

(2009-04-16 20:33:56)
标签:

c

it

分类:3G嵌入式培训

▌模板(template)——泛型编程

①函数模板(function template)

★定义:C++提供了一种方法,只写一个通用的函数,用通用的未实例化的类型来当参数类型。这个通用参数是在函数被调用的时候才实例化的,这个通用的函数就叫做函数模板。
例:
 int main()
{
 const int max=5;
 int iArray[max]={10, 20, 30, 40, 50};
 float fArray[max]={1.1, 1.2, 1.3, 1.4,1.5};
 char* cArray[max]={"one", "two", "three", "four","five"};
 
 for (int i=0; i<max; i++)
 {cout<<iArray[i]<<",";}
 cout<<"\n";
 for (i=0; i<max; i++)
 {cout<<fArray[i]<<",";}
 cout<<"\n";
 for(i=0; i<max; i++)
 {cout<<cArray[i]<<",";}
 
 return 0;
}
把for循环嵌入函数中:
void printArray(int* array, int size){
 for (int i=0; i<size; i++){
  cout<<array[i];
  if(i<(size-1)){
   cout<<",";
   }
  }
 }
 
void printArray(float* array, int size){
 for (int i=0; i<size; i++){
  cout<<array[i];
  if(i<(size-1)){
   cout<<",";
   }
  }
 }
 
void printArray(char** array, int size){
 for (int i=0; i<size; i++){
  cout<<array[i];
  if(i<(size-1)){
   cout<<",";
   }
  }
 }
for循环嵌入函数后的main函数:
main()
{
 const int max=5;
 int iArray[max]={10,20,30,40,50};
 float fArray[max]={1.1, 1.2, 1.3, 1.4,1.5};
 char* cArray[max]={"one", "two", "three", "four","five"};
 
 printArray(iArray, max);
 cout<<endl;
 
 printArray(fArray, max);
 cout<<endl;
 
 printArray(cArray, max);
 cout<<endl;
 
 return 0;
}
★为了避免上面这种复杂的形式,C++提供了一个模板结构,以参数化的形式来定义一个函数或者类。
例:(模板)
template<class T>
void printArray(T* array, int size){
 for(int i=0; i<size; i++){
  cout<<array[i];
  if(i<(size-1)){cout<<",";}
  }
 }
main()
{
 const int max=5;
 int iArray[max]={10,20,30,40,50};
 float fArray[max]={1.1, 1.2, 1.3, 1.4,1.5};
 char* cArray[max]={"one", "two", "three", "four","five"};
 
 printArray(iArray, max);
 cout<<endl;
 
 printArray(fArray, max);
 cout<<endl;
 
 printArray(cArray, max);
 cout<<endl;
 
 return 0;
}


②类模板(class template)

★例:
#include <iostream>
#include <string>
using namespace std;

template <classT> //写法等同于:template<typenameT>;
class Stack //创建一个栈的类;
{
public:
 Stack(int=10);
 ~Stack(){delete [] stackPtr;}
 int push(constT&);   //压栈;
 intpop(T&);  //弹栈;
 int isEmpty() const {returntop==-1;} //判断栈空,top=0指向第一个元素,top=-1则表示没有元素;
 int isFull() const {return top==size-1;} //栈满;
 void printOn(ostream &output); //“这句显得很垃圾”;
private:
 intsize;  //栈的大小;
 inttop;  //栈顶;
 T* stackPtr; //栈的指针;
};

template<class T>
Stack<T>::Stack(int s)
{
 size=s>0&& s<1000 ?s:10; //s>0&& s<1000 ?s:10赋值给size;
 top=-1;   //表示“一个元素都没有”
 stackPtr=new T[size];
}

template<class T>
voidStack<T>::printOn(ostream&output)
{
output<<"stack ( ";
for (int i=0; i<=top; i++)
{
 output<<stackPtr[i]<<",";
}
output<<" )\n";
}

template<class T>
int Stack<T>::push(constT& item)
{
if (!isFull())
{
 stackPtr[++top]=item;
 return 1;
}
return 0;
}

template<class T>
int Stack<T>::pop(T&item)
{
if (!isEmpty())
{
 item=stackPtr[top--];
 return 1;
}
return 0;
}

int main()
{
 int i;
 Stack<int>stack1;
 for(i=0; i<5; i++)
 {
  stack1.push(i*10);
  stack1.printOn(cout);
 }

 Stack<float>stack2;
 for (i=0; i<5; i++)
 {
  stack2.push(i*1.1);
  stack2.printOn(cout);
 }

 char* cArray[5]={"one", "two", "three","four", "five"};
 Stack<char*>stack3;
 for(i=0; i<5; i++)
 {
  stack3.push(cArray[i]);
  stack3.printOn(cout);
 }

 return 0;
}


★在实例化的时候可以给通用类型赋一个默认类型。

template<classT=int> //T可以缺省赋值,声明变量的时候,缺省赋值可以去掉<>.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值