模板初阶(泛型编程、函数模板、类模板)

1.泛型编程

如何实现一个通用的交换函数呢?

void Swap(int& left, int& right)
{
	int temp = left;
	left = right;
	right = temp;
}
void Swap(double& left, double& right)
{
	double temp = left;
	left = right;
	right = temp;
}
void Swap(char& left, char& right)
{
	char temp = left;
	left = right;
	right = temp;
}
int main()
{
    int i=0,int j=1;
    Swap(i,j);
}

使用函数重载虽然可以实现,但是有几个不好的地方:

内部的逻辑都是一样的,只是类型不一样。所以就引出模板template

2.函数模板

template<class T>

template<typename T>,typename是用来定义模板参数关键字,也可以使用class,切记L不能使用struct代替class

template<typename T1,typename T2>

更改上面的交换函数为:

template<typename T>

void Swap(T& left,T& right )

{

      T temp=left;

       left=right;

      right=temp;

}

int main()
{
    int i=0,int j=1;
    Swap(i,j); //都是调用Swap函数吗

    double x=1.1,double y=2.2

    Swap(x,y);

    cout<<Swap(int(1.1),2)<<endl;

    cout<<Swap(1.1,double(2))<<endl;

    cout<<Swap<int>(1.1,2)<<endl; 显示实例化

   cout<<Swap<double>(1.1,2)<<endl;
}

 调用的不是同一个Swap,执行的指令不一样,temp大小都不一样,建立的栈帧大小不一样,一个开4个字节,一个开8个字节

根据模板走一个实例化,编译器用模板实例化生成对应的Swap函数,                                  

3.类模板

用栈举例为什么要用类模板

typedef int DataType;
class Stack
{
public:
    Stack(size_t n = 4)
    {
        cout << "Stack()" << endl;
        _array = new DataType[capacity];//new不用检查失败,失败抛异常
        top = 0;
        capacity = n;
    }
    ~Stack()
    {
        cout << "~Stack()" << endl;
        delete[] _array;
        _array = nullptr;
        top = capacity = 0;
    }
    void push(DataType x)
    {
        _array[top++] = x;
    }
private:
    //成员变量
    DataType* _array;
    int top;
    int capacity;
};
int main()
{
    Stack st1;//int
    Stack st2;//double typedef就不能用了
    return 0;
}

但是现在有两个栈,一个想存int,一个想存double,typedef就不能用了,所以就用模板 

template<class T>
class Stack
{
public:
    Stack(size_t n = 4)
    {
        cout << "Stack()" << endl;
        _array = new T[capacity];//new不用检查失败,失败抛异常
        top = 0;
        capacity = n;
    }
    ~Stack()
    {
        cout << "~Stack()" << endl;
        delete[] _array;
        _array = nullptr;
        top = capacity = 0;
    }
    void push(const T& x)//不知道T是什么类型,就把const &加上
    {
        _array[top++] = x;
    }
private:
    T* _array;
    int top;
    int capacity;
};
int main()
{
    Stack<int> st1;//int
    Stack<double> st2;//double
    return 0;
}

 

  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 引用\[1\]中提到了解决方法的两个方案。第一个方案是在代码中添加using namespace std;或者在vector前面增加std::来指定使用std命名空间。第二个方案是在代码中包含#include <vector>并在vector前面增加std::来指定使用std命名空间。这样就可以使用vector类了。\[1\] 引用\[2\]中给出了vector类的定义,它是一个模板类,使用数组实现的可变长度的顺序容器。\[2\] 引用\[3\]中介绍了vector类的接口,包括默认构造函数、填充构造函数、范围构造函数、拷贝构造函数和赋值重载等。还介绍了容量操作,如size()、capacity()、max_size()和resize()等。\[3\] 所以,根据引用\[1\]中的解决方法,你可以在代码中添加using namespace std;或者在vector前面增加std::来解决vector不是模板C/C++的问题。然后根据引用\[2\]和引用\[3\]中的说明,你可以使用vector类来创建可变长度的顺序容器。 #### 引用[.reference_title] - *1* [E0864 vector 不是模板的解决方法](https://blog.csdn.net/tcjy1000/article/details/125016954)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [C++初阶:vector](https://blog.csdn.net/yourfriendyo/article/details/123647112)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值