「C++系列」模板

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

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

一、模板

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++系列」命名空间

猜你喜欢

转载自blog.csdn.net/xuaner8786/article/details/142574447