C++泛型编程
泛型编程是一种编程范例,旨在提高代码的重用性、扩展性和性能。C++是一种支持泛型编程的语言,通过模板 (Template) 实现泛型编程。
模板的基本概念
在C++中,使用模板可以编写通用的数据结构和算法,使得代码具有更高的通用性。模板可以分为函数模板和类模板。函数模板用于定义通用的函数,类模板用于定义通用的类。
函数模板
函数模板是一种定义通用函数的方法,它在函数定义前面加上关键字 template
,并在函数名后面加上尖括号 < >
,在尖括号中定义泛型参数。
template <typename T>
T max(T a, T b) {
return a > b ? a : b;
}
int main() {
int a = 5, b = 3;
double c = 7.5, d = 4.2;
cout << "max of " << a << " and " << b << " is " << max(a, b) << endl;
cout << "max of " << c << " and " << d << " is " << max(c, d) << endl;
return 0;
}
运行结果:
max of 5 and 3 is 5
max of 7.5 and 4.2 is 7.5
类模板
类模板用于定义通用的类,它在类定义前面加上关键字 template
,并在类名后面加上尖括号 < >
,在尖括号中定义泛型参数。
template <typename T>
class Pair {
private:
T first;
T second;
public:
Pair(T f, T s) : first(f), second(s) {}
T getFirst() const { return first; }
T getSecond() const { return second; }
};
int main() {
Pair<int> p1(1, 2);
Pair<double> p2(3.4, 5.6);
cout << "Pair 1: " << p1.getFirst() << ", " << p1.getSecond() << endl;
cout << "Pair 2: " << p2.getFirst() << ", " << p2.getSecond() << endl;
return 0;
}
运行结果:
Pair 1: 1, 2
Pair 2: 3.4, 5.6
模板的特化
模板的特化是针对某一具体类型的模板进行特殊化定义。当某些类型需要特殊实现时,可以使用模板特化。
template <typename T>
class Array {
private:
T* data;
int size;
public:
Array(int s) : size(s) {
data = new T[size];
}
T& operator[](int index) {
return data[index];
}
~Array() {
delete[] data;
}
};
template <>
class Array<double> {
private:
double* data;
int size;
public:
Array(int s) : size(s) {
data = new double[size];
}
double& operator[](int index) {
return data[index];
}
~Array() {
delete[] data;
}
};
int main() {
Array<int> arr1(5);
Array<double> arr2(3);
arr1[0] = 10;
arr2[0] = 3.14;
cout << "arr1[0]: " << arr1[0] << endl;
cout << "arr2[0]: " << arr2[0] << endl;
return 0;
}
运行结果:
arr1[0]: 10
arr2[0]: 3.14
模板的限制
在使用模板时,有一些限制需要注意:
- 模板不能隐式推断泛型参数的类型
- 静态成员变量不能用作非类型模板参数
- 不能在内部类中使用外部模板参数
- 不能使用
virtual
关键字声明为virtual
的模板方法
STL中的模板
STL (Standard Template Library) 是C++标准库中提供的一组模板类和函数的集合,包括容器、算法和迭代器等。
容器
STL中提供了多种容器,如 vector
、list
、set
、map
等,它们都是模板类,可以存储不同类型的数据。
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3, 4, 5};
for (auto i : v) {
std::cout << i << " ";
}
return 0;
}
算法
STL中还提供了多种算法,如 sort
、find
、accumulate
等,它们都是模板函数,可以对容器中的元素进行操作。
#include <algorithm>
#include <vector>
int main() {
std::vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6};
std::sort(v.begin(), v.end());
for (auto i : v) {
std::cout << i << " ";
}
return 0;
}
总结
泛型编程是C++中非常重要的一部分,可以通过模板实现通用的数据结构和算法,提高程序的重用性和扩展性。在学习和使用泛型编程时,需要注意模板的特化和限制,以及STL中提供的各种模板类和函数。通过灵活运用泛型编程,可以编写更加通用和高效的代码。