📜  C++模板(1)

📅  最后修改于: 2023-12-03 15:14:04.415000             🧑  作者: Mango

C++模板介绍

C++模板是C++语言中的一种生成代码的机制,可以通过模板定义通用的函数、类、数据结构等。使用模板,可以实现代码的复用和泛化,从而提高代码的可维护性和扩展性。

模板类型

C++模板可以分为函数模板和类模板两种。

  • 函数模板:模板可以用来定义函数,使得函数能够对不同类型的参数进行操作。例如,可以定义一个通用的排序函数,可以对任意类型的数组进行排序。
template<class T>
void bubblesort(T arr[], int n) {
    for(int i=0;i<n;i++)
        for(int j=0;j<n-i-1;j++)
            if(arr[j]>arr[j+1])
                swap(arr[j],arr[j+1]);
}
  • 类模板:模板可以用来定义类,使得类能够对不同类型的成员进行操作。例如,可以定义一个通用的栈数据结构,可以存储任意类型的元素。
template<class T>
class Stack {
private:
    T* arr; // 数组
    int top; // 栈顶指针
public:
    Stack(int size) {
        arr = new T[size];
        top = -1;
    }
    ~Stack() {
        delete[] arr;
    }
    void push(T x) {
        arr[++top] = x;
    }
    T pop() {
        return arr[top--];
    }
    bool isEmpty() {
        return (top==-1);
    }
};
模板参数

模板参数是指在定义模板时,可以用来代替类型、值或模板的变量。模板参数的语法形式为template <typename T>template <class T>,其中typenameclass可以互换使用。

template<typename T>
struct ListNode {
    T val;
    ListNode *next;
    ListNode(T x) : val(x), next(nullptr) {}
};

template<typename T>
class Solution {
public:
    ListNode<T>* mergeTwoLists(ListNode<T>* l1, ListNode<T>* l2) {
        ListNode<T>* dummy = new ListNode<T>(-1);
        ListNode<T>* curr = dummy;
        while(l1 && l2) {
            if(l1->val < l2->val) {
                curr->next = l1;
                l1 = l1->next;
            } else {
                curr->next = l2;
                l2 = l2->next;
            }
            curr = curr->next;
        }
        if(l1) curr->next = l1;
        if(l2) curr->next = l2;
        return dummy->next;
    }
};
模板特化

模板特化指对特定类型的模板参数,使用特定的实现方式。可以用template <>语法来实现模板特化。

例如,对于整数类型,可以使用快排;对于字符串类型,可以使用归并排序。

template <typename T>
void sort(T arr[], int n) {
    // 默认使用快排
    quicksort(arr, 0, n - 1);
}

// 对char*类型的数组做归并排序
template <>
void sort(char* arr[], int n) {
    mergesort(arr, 0, n - 1);
}
模板实例化

模板实例化指使用模板来生成具体的函数或类的过程。模板实例化的时候,模板参数需要具体化,即需要明确类型或值。

template <typename T>
void print(T value) {
    std::cout << value << std::endl;
}

int main() {
    // 声明模板实例
    print<int>(2);
    print<std::string>("Hello");
    return 0;
}

在模板实例化过程中,编译器会为每个不同的模板参数生成一个新的函数或类的实例。因此,模板的代码会在编译时生成,而不是运行时生成,从而实现更高效的代码。

参考资料