模板(Templates)
模板是C++中支持泛型编程的一种机制,它允许开发者定义使用任意类型作为参数的函数和类。
1. 函数模板
- 概念:函数模板是一种允许函数接受任意类型参数的模板。
- 语法:
template <typename T> void functionName(T param) { // 函数体,使用泛型类型T }
- 特点:函数模板在调用时才确定具体的类型,提供了代码复用和灵活性。
示例代码:
template <typename T>
T max(T a, T b) {
return (a > b) ? a : b;
}
int main() {
std::cout << max(1, 2) << std::endl; // 使用整型
std::cout << max(2.5, 3.1) << std::endl; // 使用浮点型
return 0;
}
2. 类模板
- 概念:类模板是一种支持创建接受任意类型参数的类的模板。
- 语法:
template <typename T> class ClassName { public: T member; ClassName(T value) : member(value) {} // 类成员函数 void function() { // 使用泛型类型T } };
- 特点:类模板允许创建具有不同数据类型的类实例。
示例代码:
template <typename T>
class Stack {
private:
T* data;
size_t size;
size_t capacity;
public:
Stack(size_t capacity) : capacity(capacity), size(0), data(new T[capacity]) {}
~Stack() { delete[] data; }
// 类成员函数
void push(const T& value) {
data[size++] = value;
}
T pop() {
return data[--size];
}
};
int main() {
Stack<int> intStack(10);
Stack<std::string> stringStack(10);
// 使用Stack类模板
return 0;
}
3. 非类型模板参数
- 概念:非类型模板参数是在编译时已知且用于控制模板行为的参数,它们不用于存储数据。
- 语法:
template <typename T, int size> class Array { T arr[size]; };
- 特点:非类型模板参数通常用于数组大小或其他编译时常量。
示例代码:
template <typename T, int N>
class Array {
public:
T elements[N];
void init() {
for (int i = 0; i < N; ++i) {
elements[i] = 0;
}
}
};
int main() {
Array<int, 5> myArray;
myArray.init(); // 初始化大小为5的整型数组
return 0;
}
4. 标准模板库STL(Standard Template Library)
- 概念:STL是C++标准库的一部分,提供了一组通用的模板类和函数,用于处理常见的数据结构和算法。
- 特点:STL包括容器(如
std::vector
、std::map
)、迭代器、算法(如std::sort
、std::find
)和函数对象(如std::plus
、std::greater
)。
示例代码:
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
int main() {
std::vector<std::string> strings;
strings.push_back("hello");
strings.push_back("world");
std::sort(strings.begin(), strings.end());
for (const auto& str : strings) {
std::cout << str << std::endl;
}
return 0;
}
模板是C++中强大的特性之一,它们提供了代码复用、类型安全性和性能优化。STL是模板最显著的应用之一,它极大地扩展了C++的能力,使其成为处理各种数据结构和算法的强大工具。
作者:
hwaityd
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。