模板与泛型基础

概念讲解

什么是模板?

模板是 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. 选择题: 模板的概念
  2. 程序阅读: 理解模板使用
  3. 编程题: 模板应用

常见题型

  • 函数模板
  • 类模板
  • 自定义比较函数

例题精讲

例题 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;
}

练习题

  1. 实现一个通用的 swap 函数。
查看答案
123456template <typename T>
void swap(T& a, T& b) {
    T temp = a;
    a = b;
    b = temp;
}
  1. 实现一个通用的栈类。
查看答案
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();
    }
};
  1. 使用 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;
});

易错点

⚠️ 注意:

  1. 模板要在编译时实例化
  2. 自定义比较函数要满足严格弱序
  3. Lambda 表达式是 C++11 的特性
  4. 模板是泛型编程的基础