C++ 模板学习笔记
1. 模板的基本概念
- 作用:模板是一种泛型编程技术,允许在编写代码时使用泛型类型或者泛型函数,从而实现代码的通用性。
- 优势:模板使得代码更具通用性和灵活性,可以减少代码的重复编写,提高代码的可重用性。
- 发展历程:模板最早出现在C++语言中,后来被其他编程语言如Java、C#等广泛采用。
示例代码:
#include <iostream>
// 定义一个函数模板
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
// 使用函数模板
std::cout << "Sum of 5 and 7: " << add(5, 7) << std::endl;
std::cout << "Sum of 3.5 and 2.5: " << add(3.5, 2.5) << std::endl;
return 0;
}
2. 模板的应用场景
- 容器类:STL中的容器类(如vector、list等)使用了模板技术,可以存储任意类型的数据。
- 算法函数:STL中的算法函数(如sort、find等)也使用了模板技术,可以适用于不同类型的数据。
- 数据结构:自定义的数据结构(如栈、队列等)可以使用模板来实现,以实现通用性。
示例代码:
#include <iostream>
#include <vector>
// 使用模板实现通用的打印函数
template <typename T>
void print(const std::vector<T>& vec) {
for (const auto& elem : vec) {
std::cout << elem << " ";
}
std::cout << std::endl;
}
int main() {
// 使用模板打印不同类型的容器
std::vector<int> intVec = {1, 2, 3, 4, 5};
std::vector<double> doubleVec = {1.1, 2.2, 3.3, 4.4, 5.5};
std::cout << "Int vector: ";
print(intVec);
std::cout << "Double vector: ";
print(doubleVec);
return 0;
}
3. 模板的使用技巧
- 模板参数:模板参数可以是类型参数(如
typename T
)或者非类型参数(如int N
)。 - 模板特化:可以对模板进行特化,以处理特定类型的情况。
- 模板嵌套:可以在模板类或者模板函数中嵌套使用其他模板。
示例代码:
#include <iostream>
// 模板类
template <typename T>
class Pair {
public:
Pair(const T& first, const T& second) : first(first), second(second) {}
T getFirst() const { return first; }
T getSecond() const { return second; }
private:
T first;
T second;
};
// 模板函数
template <typename T>
void printPair(const Pair<T>& pair) {
std::cout << "(" << pair.getFirst() << ", " << pair.getSecond() << ")" << std::endl;
}
int main() {
// 使用模板类和模板函数
Pair<int> intPair(1, 2);
Pair<double> doublePair(3.3, 4.4);
std::cout << "Int pair: ";
printPair(intPair);
std::cout << "Double pair: ";
printPair(doublePair);
return 0;
}
4. 实战案例分析
- 容器类实现:自定义一个通用的动态数组容器类,支持存储任意类型的数据。
- 算法函数实现:实现一个通用的快速排序算法函数,可以适用于不同类型的数据。
- 数据结构实现:实现一个通用的二叉树数据结构,支持存储任意类型的数据。
示例代码:
// 容器类实现示例
template <typename T>
class DynamicArray {
public:
DynamicArray(int size) : size(size) {
data = new T[size];
}
~DynamicArray() {
delete[] data;
}
void set(int index, const T& value) {