c++ 模版

本文详细介绍了C++中的泛型编程,包括函数模板和类模板的概念、声明、调用方式以及实例化过程,展示了如何使用模板处理不同数据类型的通用操作,如交换变量值和创建动态类型堆栈。
摘要由CSDN通过智能技术生成

    泛型编程:
        是指数据的类型是广泛,任意的数据类型

    模板:可以将一个函数或类描述成一个模板,例如:画画,给一个人物模型上色彩,根据用户上的色彩是什么人物显示什么样的色彩,模版并不能直接使用,它只是一个框架。
模板:函数模板和类模板

1 函数模版

关键字:template、class/typename
格式:
    template   <模板形参1,模板形参2,........>函数返回值   函数名   ([参数1,参数2,.......])
    {

    }
    template   <class T1,class T2,........>函数返回值   函数名   ([参数1,参数2,.......])
    {
        
    }
    template   <typename T1,typename T2,........>函数返回值   函数名   ([参数1,参数2,.......])
    {

    }    
注意:
    (1)template用于声明一个模板
    (2)typename/class来声明模板形参,模板形参是指传递给该函数的参数类型(模板形参就是该函数的参数类型),指定该函数里用的模板形参的类型
    (3)模板形参要与函数形参一一对应
    
函数模板的调用:
    与C/C++普通函数调用一致:
        格式:
            函数名(实参1,实参2);//隐式调用(模板形参)
        例如:
            sum(10,20);
    函数模板的显示调用(模板形参):
        格式:
            函数名 <数据类型1,数据类型2,.......>(实参1,实参2,......);
        例如:
            sum<int ,   char> (10,'a');

以下代码可以实现两个值的交换,T代表任意数据类型:

#include<iostream>
using namespace std;
template<typename T>//T可以为多个类型的数据
void exchange(T &a,T &b)//C++引用
{
    T t;//定义T作为交换中介
    t=b,b=a,a=t;//交换
}
main()
{
    int a=4,b=5;
    float c=2.4,d=3.6;
    exchange(a,b);
    cout<<a<<"\t"<<b<<endl;
    exchange(c,d);
    cout<<c<<"\t"<<d;
}

2 类模版

关键字:template、class/typename
格式:
    template  <模板形参1 , 模板形参2,非类型形参,......> class  类名
    {
        
    };
    template  <class T1 , class T2,int  sum,......> class  类名
    {
        
    };    
    template  <typename T1 , typename T2,int  sum,......> class  类名
    {
        
    };
注:
    (1)class T1/T2等是模板形参,int  sum:非类型形参
        非类型:是指实例化类的时候,不能传递类型,只能传递实参,非类型形参是整型:int\short\long等等,不能是字符串或浮点型等
    (2)<>里的classs用于声明模板形参,类名前的class用于声明一个类

实例化类模板:
格式:
    类名 <参数类型1,参数类型2,非类型实参,......>对象名 (构造函数实参1,构造函数实参2,....);
例如:
    People<int , int>people(10,20);//实例化模板类的对象
    People<int , int,10>people(10,20);//实例化模板类的对象 ,10是非类型形参的实参

以下是一个简单的堆栈类模板的示例:

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

// 定义堆栈类模板
template <typename T>
class Stack {
private:
    vector<T> elements;  // 使用 vector 作为底层存储结构

public:
    // 将元素推入堆栈
    void push(const T& element) {
        elements.push_back(element);
    }

    // 从堆栈中弹出元素
    void pop() {
        if (!elements.empty()) {
            elements.pop_back();
        }
    }

    // 获取堆栈顶部的元素
    T top() const {
        if (!elements.empty()) {
            return elements.back();
        }
        // 在实际应用中可能需要处理空堆栈的情况
        // 这里简化为返回默认值
        return T();
    }

    // 检查堆栈是否为空
    bool isEmpty() const {
        return elements.empty();
    }

    // 获取堆栈中的元素数量
    size_t size() const {
        return elements.size();
    }
};

int main() {
    // 使用堆栈类模板存储整数
    Stack<int> intStack;

    intStack.push(10);
    intStack.push(20);
    intStack.push(30);

    cout << "Top element: " << intStack.top() << endl;
    cout << "Stack size: " << intStack.size() << endl;

    intStack.pop();

    cout << "Top element after pop: " << intStack.top() << endl;
    cout << "Stack size after pop: " << intStack.size() << endl;

    // 使用堆栈类模板存储字符串
    Stack<std::string> stringStack;

    stringStack.push("Hello");
    stringStack.push("World");

    cout << "Top element (string): " << stringStack.top() << endl;
    cout << "Stack size (string): " << stringStack.size() << endl;

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

语文同步练习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值