技术原理

【c/c 学习心得】涵数模板function templete

入门c 学得function templete这一定义,
不清楚是干麻用的,手记一下

想象一下,如今你可以界定一个比大小的涵数,
让大数字a, b比大小,
a<b传回-1,a>b传回1,a==b传回0,
例如:

int compare(int a, int b)
{
    if(a<b) return -1;
    if(a>b) return 1;
    return 0;
}

可是那么问题来了,
将会人们会期待很多种多样型别都能够比大小,
不只能int,也要界定float, double, ...各种各样不一样的形别

int compare(float a, float b)
{
    if(a<b) return -1;
    if(a>b) return 1;
    return 0;
}

涵数里边做的事大部分全是一样的,
但假如界定这幺多涵数得话,程式码会十分的冗,
也非常容易错误,
这时候就必须「涵数模板」了
界定的方式像那样:

template <typename T>
int compare(T a, T b)
{
    if(a<b) return -1;
    if(a>b) return 1;
    return 0;
}

在涵数宣布前再加template <typename T> (或template <class T>),
只能当程序通话涵数时,才会了解用的是哪家类型

例如通话compare(3, 4)得话,类型T就是说int
通话compare(1.3, -2.5)得话,类型T就是说double

通话compare(1.3, 2)则会造成不正确,
由于template <typename T> int compare(T a, T b)表达主要参数的型别是同样的,
不可以一下是double,一下是int

好几个主要参数的模板

上例中,假如涵数必须传不一样型其他主要参数,
则能够界定二个模板的主要参数:

template <typename T, typename U>
int compare(T a, U b)
{
    if(a<b) return -1;
    if(a>b) return 1;
    return 0;
}

详细範例程式码

#include <iostream>
using namespace std;

template <typename T, typename U>
int compare(T a, U b)
{
    if(a<b) return -1;
    if(a>b) return 1;
    return 0;
}

int main()
{
    std::cout << compare(1, 2) << std::endl;
    std::cout << compare(1.3, -2) << std::endl;
    return 0;
}

重中之重: 当必须涵数作用相近,仅仅类型不一样,就很合适用模板

这里再举个小事例,
假定人们要想写一个涵数,
把列阵前边的n个原素印出,
但人们事前不确定性列阵的原素型别,
就可以那样界定:

/**将列阵的前n个字印出*/
template <typename T>
void Print(int n, T element)
{
    for(int k=0; k<n; k  )
        cout<< element[k] <<" ";
    cout<<endl;
}

譬如说

vector<int> A={1,2,3,5,6,9,15,20,36,85};
Print(5,arr1); //会印出来1 2 3 5 6

可是,今日我发现了若T是字串(string)的情况下,
我想要做非常的解决,原素中间不必印出空格符,
那怎幺办呢?
这时候,便必须为T是string的情况界定一个非常的模板,
如以下程序:

template <>
void Print<string>(int n, string element)
{
    for(int k=0; k<n; k  )
        cout<< element[k];
    cout<<endl;
}

详细範例程式码

#include <iostream>
#include <string>
#include <vector>
using namespace std;


/**将列阵的前n个字印出*/
template <typename T>
void Print(int n, T element)
{
    for(int k=0; k<n; k  )
        cout<< element[k] <<" ";
    cout<<endl;
}

/**特化模板,T是string时做非常的解决*/
template <>
void Print<string>(int n, string element)
{
    for(int k=0; k<n; k  )
        cout<< element[k];
    cout<<endl;
}

int main(void)
{
    vector<int> A={1,2,3,5,6,9,15,20,36,85};
    Print(5,A); //会印出来1 2 3 5 6

    string s="HelloWorld";
    Print(5,s); //会印出来Hello
}

你也可能喜欢

1 条评论

发表评论

您的电子邮件地址不会被公开。 必填项已用 * 标注

提示:点击验证后方可评论!

插入图片
人工智能专业课程都有哪些 投稿者
我还没有学会写个人说明!
最近文章
  • * 没有更多文章了
  • 热门搜索

    分类目录