C++泛型编程Generic Programming的使用攻略
什么是泛型编程Generic Programming
泛型编程是一种以通用算法为基础写程序的方式,它在写程序时把算法和数据结构的实现分开,以达到复用代码的目的。C++中泛型编程主要通过模板来实现。
泛型编程的优点
- 可重用性:泛型编程可以复用代码,使用一个函数解决多个问题。
- 可扩展性:当在实现具体算法时,可在不改变泛型算法的情况下增加新的数据类型或算法。
- 安全性:泛型编程的参数类型是由编译器检查的,所以在编译期就可以避免类型错误。
泛型编程的使用
1. 函数模板
函数模板是指一个通用的函数定义,可用于多个数据类型。例如,可以使用以下方式实现交换两个变量的函数:
template <typename T>
void swap(T& x, T& y) {
T temp = x;
x = y;
y = temp;
}
在函数模板定义中,参数通常以 "typename" 或 "class" 关键字开始,后面跟变量名。在函数定义中,就可以用这个参数来声明变量、使用函数等。
例1:使用函数模板实现两个整数或两个浮点数的交换:
#include <iostream>
using namespace std;
template <typename T>
void swap(T& x, T& y) {
T temp = x;
x = y;
y = temp;
}
int main() {
int a = 3, b = 5;
float c = 3.5, d = 7.8;
cout << "交换前:" << a << " " << b << endl;
swap(a, b);
cout << "交换后:" << a << " " << b << endl;
cout << "交换前:" << c << " " << d << endl;
swap(c, d);
cout << "交换后:" << c << " " << d << endl;
return 0;
}
上面的代码定义了一个 swap 函数模板,接收两个参数,并将它们交换。在测试代码(main 函数)中,先使用整数测试了一下,再用浮点数进行了测试。
2. 类模板
类模板是指一个通用的类定义,可用于多种数据类型。例如,可以定义一个能够保存任何类型元素的栈类,代码如下:
template <typename T>
class Stack {
public:
Stack(int size = 10);
bool push(const T& val);
bool pop(T& val);
bool empty();
bool full();
private:
int m_top;
int m_size;
T* m_data;
};
在类模板定义中,也使用 "typename" 或 "class" 关键字开始,后面跟参数名。在类定义中,就可以用这个参数来定义成员变量、成员方法等。在模板类中使用类型时,需要在前面加上 "typename" 关键字,以告诉编译器这个名称是一个类型名。
例2:使用类模板定义一个栈,并进行测试:
#include <iostream>
#include "stack.h"
using namespace std;
int main() {
Stack<int> stack;
for (int i = 0; i < 10; i++) {
stack.push(i);
}
int val;
while (!stack.empty()) {
stack.pop(val);
cout << val << " ";
}
cout << endl;
return 0;
}
上面的代码定义了一个 Stack 类模板,在测试代码(main 函数)中,看起来就像是在使用一个 int 类型的栈。
3. 结构体模板
结构体模板是指一个通用的结构体定义,可用于多种数据类型。例如,可以定义一个二元组结构体,代码如下:
template <typename T1, typename T2>
struct Pair {
T1 first;
T2 second;
Pair() {}
Pair(T1 a, T2 b) : first(a), second(b) {}
bool operator < (const Pair<T1, T2>& p) const {
return first < p.first || (first == p.first && second < p.second);
}
};
在结构体模板定义中,也使用 "typename" 或 "class" 关键字开始,后面跟参数名。在结构体定义中,就可以用这个参数来定义成员变量等。
例3:使用结构体模板实现一个存储成绩和姓名的二元组。
#include <iostream>
#include <vector>
#include <algorithm>
#include "pair.h"
using namespace std;
int main() {
vector<Pair<string, int>> vec;
vec.push_back(Pair<string, int>("Alice", 95));
vec.push_back(Pair<string, int>("Bob", 80));
vec.push_back(Pair<string, int>("Charlie", 70));
sort(vec.begin(), vec.end());
for (auto it : vec) {
cout << it.first << " " << it.second << endl;
}
return 0;
}
上面的代码定义了一个 Pair 结构体模板,接收两个参数,并将它们保存在 first 和 second 两个成员变量中。在测试代码(main 函数)中,创建了一个 Pair 类型的数组 vec,并在其中插入三个元素。然后使用 sort() 函数对数组进行排序,并输出每个元素的姓名和成绩。
总结
本文介绍了泛型编程Generic Programming的使用,包括函数模板、类模板和结构体模板等。通过这些模板的使用,可以让代码更加通用,提高代码复用性,同时也可提高代码的安全性和可扩展性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++泛型编程Generic Programming的使用 - Python技术站