模板与泛型基础
概念讲解
什么是模板?
模板是 C++ 中实现泛型编程的工具。
函数模板
12345678template <typename T>
T max(T a, T b) {
return a > b ? a : b;
}
// 使用
int maxInt = max(3, 5);
double maxDouble = max(3.14, 2.71);类模板
12345678910111213141516171819template <typename T>
class Stack {
private:
vector<T> data;
public:
void push(T val) {
data.push_back(val);
}
T top() {
return data.back();
}
void pop() {
data.pop_back();
}
};
// 使用
Stack<int> intStack;
Stack<string> stringStack;自定义比较函数
函数指针
12345bool cmp(int a, int b) {
return a < b;
}
sort(arr, arr + n, cmp);Lambda 表达式
123sort(arr, arr + n, [](int a, int b) {
return a < b;
});函数对象
1234567struct Compare {
bool operator()(int a, int b) const {
return a < b;
}
};
sort(arr, arr + n, Compare());考点分析
初赛考查方式
- 选择题: 模板的概念
- 程序阅读: 理解模板使用
- 编程题: 模板应用
常见题型
- 函数模板
- 类模板
- 自定义比较函数
例题精讲
例题 1:函数模板
题目: 实现一个通用的 max 函数。
解答:
123456789101112131415#include <iostream>
using namespace std;
template <typename T>
T max(T a, T b) {
return a > b ? a : b;
}
int main() {
cout << max(3, 5) << endl;
cout << max(3.14, 2.71) << endl;
cout << max('a', 'b') << endl;
return 0;
}例题 2:自定义排序
题目: 按结构体的某个字段排序。
解答:
12345678910111213141516171819202122#include <iostream>
#include <algorithm>
using namespace std;
struct Student {
string name;
int score;
};
int main() {
Student students[] = {{"Alice", 90}, {"Bob", 85}, {"Charlie", 95}};
sort(students, students + 3, [](const Student& a, const Student& b) {
return a.score > b.score;
});
for (int i = 0; i < 3; i++) {
cout << students[i].name << " " << students[i].score << endl;
}
return 0;
}练习题
- 实现一个通用的 swap 函数。
查看答案
123456template <typename T>
void swap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}- 实现一个通用的栈类。
查看答案
123456789101112131415161718192021template <typename T>
class Stack {
private:
vector<T> data;
public:
void push(T val) {
data.push_back(val);
}
T top() {
return data.back();
}
void pop() {
data.pop_back();
}
bool empty() {
return data.empty();
}
int size() {
return data.size();
}
};- 使用 Lambda 表达式自定义排序。
查看答案
1234567891011#include <algorithm>
// 按降序排序
sort(arr, arr + n, [](int a, int b) {
return a > b;
});
// 按结构体字段排序
sort(students, students + n, [](const Student& a, const Student& b) {
return a.score > b.score;
});易错点
⚠️ 注意:
- 模板要在编译时实例化
- 自定义比较函数要满足严格弱序
- Lambda 表达式是 C++11 的特性
- 模板是泛型编程的基础