「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
类型的Box
或double
类型的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. 应用场景
- 容器类模板:
- 用于实现如向量(
std::vector
)、列表(std::list
)和映射(std::map
)等容器,这些容器可以存储任何类型的数据,而无需编写特定类型的代码。
- 算法模板:
- 实现通用的算法,如排序(
std::sort
)、搜索(std::find
)和查找(std::binary_search
)等,这些算法可以在任何类型的数据上工作,而无需修改代码。
- 泛型函数模板:
- 允许定义可以处理不同类型参数的函数。例如,可以定义一个比较两个值大小的函数模板,它可以用于比较整数、浮点数等。
- 类模板:
- 定义一个类模板,该类可以处理不同类型的成员变量和方法。例如,可以定义一个通用的栈或队列类模板,它们可以存储任何类型的数据。
- 元编程模板:
- 用于执行元编程,其中代码在编译时生成。这可用于创建用于反射和代码生成的高度灵活和通用的库。
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;
}
三、相关链接
- Visual Studio Code下载地址
- Sublime Text下载地址
- 「C++系列」C++简介、应用领域
- 「C++系列」C++ 基本语法
- 「C++系列」C++ 数据类型
- 「C++系列」C++ 变量类型
- 「C++系列」C++ 变量作用域
- 「C++系列」C++ 常量知识点-细致讲解
- 「C++系列」C++ 修饰符类型
- 「C++系列」一篇文章说透【存储类】
- 「C++系列」一篇文章讲透【运算符】
- 「C++系列」循环
- 「C++系列」判断
- 「C++系列」函数/内置函数
- 「C++系列」数字/随机数
- 「C++系列」数组
- 「C++系列」字符串
- 「C++系列」指针
- 「C++系列」引用
- 「C++系列」日期/时间
- 「C++系列」输入/输出
- 「C++系列」数据结构
- 「C++系列」vector 容器
- 「C++系列」类/对象
- 「C++系列」继承
- 「C++系列」重载运算符/重载函数
- 「C++系列」多态
- 「C++系列」数据抽象
- 「C++系列」数据封装
- 「C++系列」 接口(抽象类)
- 「C++系列」文件和流
- 「C++系列」异常处理
- 「C++系列」动态内存
- 「C++系列」命名空间