当前位置: 首页 > article >正文

「C++系列」模板

【人工智能教程】,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。

点击跳转到网站:【人工智能教程】

文章目录

  • 一、模板
    • 1. 函数模板
    • 2. 类模板
    • 3. 模板特化
  • 二、应用场景
    • 1. 应用场景
    • 2. 案例代码
      • ①泛型排序算法
      • ②泛型类模板
  • 三、相关链接

一、模板

C++ 模板是C++支持泛型编程的工具,它允许程序员编写与类型无关的代码。模板主要分为两类:函数模板和类模板。

1. 函数模板

函数模板允许你定义一个函数,这个函数可以对不同类型的参数进行操作。函数模板的定义以template关键字开始,后面跟随模板参数列表(通常是类型参数),然后是函数参数列表和函数体。

#include <iostream>

// 函数模板定义
template<typename T>
T max(T a, T b) {
    return (a > b) ? a : b;
}

int main() {
    std::cout << "Max(5, 3) = " << max(5, 3) << std::endl; // 调用int类型的max
    std::cout << "Max(5.5, 4.6) = " << max(5.5, 4.6) << std::endl; // 调用double类型的max
    return 0;
}

在这个例子中,max函数模板可以工作于任何可以比较大小的类型上。

2. 类模板

类模板允许你定义类,这些类可以与不同类型的数据一起工作。与函数模板类似,类模板的定义也是以template关键字开始,后面跟随模板参数列表,然后是类定义。

#include <iostream>

// 类模板定义
template<typename T>
class Box {
private:
    T value;
public:
    Box(T val) : value(val) {}
    void display() {
        std::cout << "Value: " << value << std::endl;
    }
};

int main() {
    Box<int> intBox(10);
    intBox.display(); // 输出:Value: 10

    Box<double> doubleBox(3.14);
    doubleBox.display(); // 输出:Value: 3.14

    return 0;
}

在这个例子中,Box类模板可以被实例化为int类型的Boxdouble类型的Box,或任何其他类型的Box

3. 模板特化

有时候,你可能需要对模板的某个特定类型进行特殊处理。这可以通过模板特化来实现。模板特化可以是完全特化(指定所有模板参数的具体类型)或部分特化(仅指定部分模板参数的具体类型)。

// 模板特化示例
template<>
class Box<char> {
private:
    char value;
public:
    Box(char val) : value(val) {}
    void display() {
        std::cout << "Character: " << value << std::endl;
    }
};

// 现在Box<char>有了特定的实现

二、应用场景

C++模板是C++支持泛型编程的一种重要方式,它允许程序员编写与类型无关的代码,从而提高了代码的重用性和灵活性。C++模板的应用场景广泛,以下是一些常见的应用场景及案例代码。

1. 应用场景

  1. 容器类模板
  • 用于实现如向量(std::vector)、列表(std::list)和映射(std::map)等容器,这些容器可以存储任何类型的数据,而无需编写特定类型的代码。
  1. 算法模板
  • 实现通用的算法,如排序(std::sort)、搜索(std::find)和查找(std::binary_search)等,这些算法可以在任何类型的数据上工作,而无需修改代码。
  1. 泛型函数模板
  • 允许定义可以处理不同类型参数的函数。例如,可以定义一个比较两个值大小的函数模板,它可以用于比较整数、浮点数等。
  1. 类模板
  • 定义一个类模板,该类可以处理不同类型的成员变量和方法。例如,可以定义一个通用的栈或队列类模板,它们可以存储任何类型的数据。
  1. 元编程模板
  • 用于执行元编程,其中代码在编译时生成。这可用于创建用于反射和代码生成的高度灵活和通用的库。

2. 案例代码

①泛型排序算法

#include <iostream>
#include <algorithm> // 用于std::swap

// 泛型排序函数模板
template<typename T>
void sort(T arr[], int size) {
    for (int i = 0; i < size - 1; i++) {
        for (int j = i + 1; j < size; j++) {
            if (arr[i] > arr[j]) {
                std::swap(arr[i], arr[j]);
            }
        }
    }
}

int main() {
    int arr1[] = {1, 3, 2};
    sort(arr1, 3); // 排序整型数组
    for (int i = 0; i < 3; i++) {
        std::cout << arr1[i] << " ";
    }
    std::cout << std::endl;

    double arr2[] = {3.14, 1.59, 2.65};
    sort(arr2, 3); // 排序双精度浮点型数组
    for (int i = 0; i < 3; i++) {
        std::cout << arr2[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

②泛型类模板

#include <iostream>

// 泛型类模板
template<typename T>
class Box {
private:
    T value;
public:
    Box(T val) : value(val) {}
    void display() {
        std::cout << "Value: " << value << std::endl;
    }
};

int main() {
    Box<int> intBox(10);
    intBox.display(); // 输出:Value: 10

    Box<double> doubleBox(3.14);
    doubleBox.display(); // 输出:Value: 3.14

    return 0;
}

在这里插入图片描述

三、相关链接

  1. Visual Studio Code下载地址
  2. Sublime Text下载地址
  3. 「C++系列」C++简介、应用领域
  4. 「C++系列」C++ 基本语法
  5. 「C++系列」C++ 数据类型
  6. 「C++系列」C++ 变量类型
  7. 「C++系列」C++ 变量作用域
  8. 「C++系列」C++ 常量知识点-细致讲解
  9. 「C++系列」C++ 修饰符类型
  10. 「C++系列」一篇文章说透【存储类】
  11. 「C++系列」一篇文章讲透【运算符】
  12. 「C++系列」循环
  13. 「C++系列」判断
  14. 「C++系列」函数/内置函数
  15. 「C++系列」数字/随机数
  16. 「C++系列」数组
  17. 「C++系列」字符串
  18. 「C++系列」指针
  19. 「C++系列」引用
  20. 「C++系列」日期/时间
  21. 「C++系列」输入/输出
  22. 「C++系列」数据结构
  23. 「C++系列」vector 容器
  24. 「C++系列」类/对象
  25. 「C++系列」继承
  26. 「C++系列」重载运算符/重载函数
  27. 「C++系列」多态
  28. 「C++系列」数据抽象
  29. 「C++系列」数据封装
  30. 「C++系列」 接口(抽象类)
  31. 「C++系列」文件和流
  32. 「C++系列」异常处理
  33. 「C++系列」动态内存
  34. 「C++系列」命名空间

http://www.kler.cn/a/328394.html

相关文章:

  • Java策略模式应用实战
  • 【ArcGISPro】使用AI模型提取要素-提取车辆(目标识别)
  • 机器学习day5-随机森林和线性代数1最小二乘法
  • vue3 路由写法及传参方式 !超详细
  • RabbitMQ教程:发布/订阅模式(Publish/Subscribe)(三)
  • jmeter常用配置元件介绍总结之配置元件
  • 项目实战:构建高效可扩展的Flask Web框架:集成Flask-SQLAlchemy、Marshmallow与日志管理
  • SpringBoot集成Redis及SpringCache缓存管理
  • 了解什么是CMMI认证
  • jenkins项目发布基础
  • 【网络基础】网络常识快速入门知识清单,看这篇文章就够了
  • Docker实践与应用:深度探索与丰富案例
  • 论文阅读- On the Feasibility of Fully AI-automated Vishing Attacks
  • 基于SpringBoot的街道志愿者服务平台设计与实现
  • npm、yarn、pnpm对比
  • 2024年9月个人工作生活总结
  • STM32原理知识查询表
  • linux常用命令汇编(持续更新)
  • 计算机毕业设计之:音乐媒体播放及周边产品运营平台(源码+文档+讲解)
  • 软件供应链安全管理实践之中国科学院软件研究所
  • Python和MATLAB库尔巴克–莱布勒散度信息论统计学生物学和算法模型
  • 李沐深度学习-多层感知机、模型选择、过拟合、欠拟合
  • PHP基础知识
  • 前端独立实现页面是否有发布
  • Android 热点分享二维码功能简单介绍
  • openpnp - 底部相机高级校正的参数设置