波奇学C++:模板和STL

什么是模板?为什么我们需要模板?

先假设一个场景,我们要编写一个函数交换a,b两个数的值

void swap(int& a,int& b)
{
    int cmp=a;
    a=b;
    b=a;
}

swap函数可以帮我们交换两个int型的值,那如果要交换的类型是float,double类型呢?

当然我们可以选择函数重载,使它支持多个数据类型。

void swap(float& a,float& b);
void swap(double& a,double& b);
......

可是这就意味着我们就要编写大量重复的代码。

有没有一种方法可以优化这个过程,少写代码有能实现重载?

模板(template)是一种语法,是为了优化重载而产生的。

模板分为函数模板和类模板

这里我们先讲函数模板

template <typename T> //模板参数T T可以被实例化int,double等类型

void swap(T& x1,T& x2)
{
    T tmp=x1;
    x1=x2;
    x2=tmp;
}

int main()
{
    int a=0; b=1;
    double c=1.1,d=2.2;
    swap(a,b);//1;
    swap(c,d);//3.3
    return 0;
}

这样无论是int,float,int*,double,都可以使用

模板的实现原理:

模板类比成类,类实例化后才能使用,模板实例化重载函数被调用,因此swap(a,b)和swap(c,d)调用的不是void swap(T& x1,T& x2);而是void swap(T& x1,T& x2)产生的void swap(int x1,int x2), void swap(double x1, double x2)这两个函数。

得出结论:两次调用不是调用同一个函数,而是模版产生的同一函数。

泛型编程

当我们用模板进行编程时,函数针对的就不是某一种类型,而是广泛的类型,因此用模板编程方式也叫泛型编程。

模板的语法

template<typename T>//可以替换为template<class T>
//temppalte 关键字
void Swap(T& x, T& y)
{
	T tmp = x;
	x = y;
	y = tmp;
}

T可以是自定义类型吗?可以

和atuo有关吗? 虽然都有自动识别类型的意思但不是一样的

T是固定的吗? 不是,T可以替换成T1,T2

x,y可以是不同类型吗?可以的

x,y可以充当返回值吗?可以的

模板的显式实例化

当x,y是不同类型时,会报错

temeplate<class T>
T Add(contst T& x,const T& y)
{
    return a+b;
}
int main()
{
    int a=0;
    double b=0;
    cout<<Add(a,b)<<endl;
}

T是int还是double型

用显示实例化来指定返回类型

ccout<<<int>Add(a,b)<<endl;

T就是int 返回值就是int型。相当于指定了T的类型,这就是显式实例化。

显式实例化更常用于指定栈的空间

T* fun(T n)
{
    return new a[n];
}

int*p =<int> fun(n);

相当于T 被替换为int。

类模板

template<class T>
class A
{
public:
    A()
    {
        _array=new T[capacity];
    }
private:
    T* _arry;
}

A<int> a;

类模板只能显式实例化。

类模板的声明定义分离

template<class T>
class A
{
public:
    A()
    {
        _array=new T[capacity];
    }
    void value();
private:
    T* _arry;
    int a=0;
}

template<class T>
void A<T>::value()
{
    return a;
}
A<int> a;
类外每个函数都要重写一遍template<class T>
函数的类型是A<T>,对于普通类,类名和类型是一样的,对于这个模板类,类名是A,类型是A<T>

 STL:STL是什么?

STL是包罗数据结构和算法的软件框架。

以前用c的时候,我们要写二叉树,我们只能手搓一个,但是有人替换我们写好了树,图等多种数据结构,放在了STL中,我们只有调用STL的数据结构就行了。

STL六大组件

 以String为例,什么是String?

String 是一个类里面包含成员变量和成员函数,String是用一个类来表示字符串,成员变量和成员函数提供了多种操作字符串的形式。字符串由C的char*,char []变成了String对象表示方式。 

学习string打开 cplusplus.com - The C++ Resources Network ​​​​​​

 搜索类string,查看字符串的构造函数

int main()
{
	string s1();//空字符串
	string s2(10,'x');//"xxxxxxxxxx"
	string s3("abcdef");//"abcdef"
	string s4(s2);//copy s4
}

 

+=运算符重载是为了使得字符串有拼接的属性

s2 += s3;//"xxxxxxxxxxabcdef"

学习STL的关键是学习文档的用法,利用学习的类和重载符的知识来更好地理解STL。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值