📅  最后修改于: 2023-12-03 15:14:04.415000             🧑  作者: Mango
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>
,其中typename
和class
可以互换使用。
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;
}
在模板实例化过程中,编译器会为每个不同的模板参数生成一个新的函数或类的实例。因此,模板的代码会在编译时生成,而不是运行时生成,从而实现更高效的代码。