c++ 函数模板
文章目录
- c++ 函数模板
- C++ 函数模板概念
- **函数模板**的作用:
- 函数模板语法
- 示例:冒泡排序
- **代码解析**
- **运行结果**
- 函数模板的优势
- 小结
C++ 函数模板概念
函数模板是 C++ 中的一个泛型编程特性,它允许你为不同的类型编写一个通用的函数定义,这样你就可以使用相同的函数名和相似的实现,处理不同的数据类型。
函数模板的作用:
- 在编写代码时不需要为每种数据类型编写单独的函数
- 提高代码的重用性和灵活性
函数模板语法
template <typename T>
T function_name(T arg1, T arg2) {// 函数实现return arg1 + arg2;
}
template <typename T>
:定义一个类型参数T
,这个T
可以是任意类型。T function_name(T arg1, T arg2)
:函数的返回类型和参数类型都是T
,也就是根据模板类型来决定。
示例:冒泡排序
#include <iostream>
#include <array>// 冒泡排序模板函数
template <typename T, size_t N>
void bubbleSort(std::array<T, N>& arr) {for (size_t i = 0; i < N - 1; ++i) {// 每次循环“冒泡”到最后的元素已经是最大值,所以减少一次比较for (size_t j = 0; j < N - i - 1; ++j) {if (arr[j] > arr[j + 1]) {// 交换两个元素std::swap(arr[j], arr[j + 1]);}}}
}// 打印数组的模板函数
template <typename T, size_t N>
void printArray(const std::array<T, N>& arr) {for (const auto& element : arr) {std::cout << element << " ";}std::cout << "\n";
}int main() {// 示例 1: 对整数数组排序std::array<int, 5> intArray = {64, 34, 25, 12, 22};std::cout << "Before sorting: ";printArray(intArray);bubbleSort(intArray);std::cout << "After sorting: ";printArray(intArray);// 示例 2: 对浮点数数组排序std::array<float, 5> floatArray = {64.5, 34.2, 25.1, 12.8, 22.0};std::cout << "Before sorting: ";printArray(floatArray);bubbleSort(floatArray);std::cout << "After sorting: ";printArray(floatArray);return 0;
}
代码解析
-
模板定义
- 使用
template<typename T, size_t N>
定义一个泛型模板,允许冒泡排序函数适用于任何类型(如int
、float
、double
等)和固定大小的数组。
- 使用
-
std::array
的使用- 使用
std::array
来处理固定大小的数组,模板参数T
表示元素类型,N
表示数组大小。
- 使用
-
冒泡排序逻辑
- 使用两层嵌套循环逐步将最大值“冒泡”到数组末尾,每次循环比较相邻元素并交换它们。
-
std::swap
的使用- 使用 STL 提供的
std::swap
函数交换两个元素。
- 使用 STL 提供的
-
打印函数模板
printArray
函数是另一个模板函数,用于打印数组内容,与bubbleSort
模板共享相同的类型定义。
运行结果
示例代码会输出排序前和排序后的数组内容:
Before sorting: 64 34 25 12 22
After sorting: 12 22 25 34 64
Before sorting: 64.5 34.2 25.1 12.8 22
After sorting: 12.8 22 25.1 34.2 64.5
函数模板的优势
优势 | 说明 |
---|---|
类型通用 | 允许函数处理多种类型,避免重载和重复编写函数 |
编译期检查 | 模板会在编译期进行类型检查,避免运行时错误 |
代码简洁 | 一个函数模板即可处理不同类型,减少冗余代码 |
小结
template <typename T>
定义了一个类型参数 T。- 可以用相同的函数模板处理不同的数据类型。
- C++ 会在调用时自动推导出类型,或者你可以显式指定类型参数。