【数据结构实战C++】8 泛型编程
作者 CodeAllen ,转载请注明出处
数据结构的特点
- -专注于数据元素之间的关系
- -专注于特定结构之上的算法
也就是说数据结构并不关注数据元素的具体类型(这个是很关键的一个概念)
如何为数据结构的学习选择合适的编程语言?
从上边的分析可以知道,支持泛型编程的语言最适合学习数据结构
c++是支持泛型编程的,其中的模板就是泛型编程
泛型编程概念
-不考虑具体数据类型的编程方式
对于swap函数可以考虑下方的泛型写法
void swap(T& a , T& b)
{
T t = a;
a = b;
b = t;
}
swap泛型写法中的T并不是一个具体的数据类型,而是泛指任意的数据类型
c++中的函数模板
-一种特殊的函数可用不同类型进行调用
-看起来和普通函数很相似,区别是类型可以被参数化
template<typename T>
void swap(T& a , T& b)
{
T t = a;
a = b;
b = t;
}
函数模板的语法规则
- -template关键字用于声明开始进行泛型编程
- -typename 关键字用于声明泛型类型
函数模板的使用
-自动类型推导调用
-具体类型显示调用
int a = 0;
int b = 1;
swap(a, b); //自动推导
float c = 2;
float d = 3;
swap<float>(c, d); //显示调用
实验:函数模板
#include <iostream>
using namespace std;
template <typename T>
void Swap(T& a, T& b)
{
T t = a;
a = b;
b = t;
}
int main()
{
int a = 2;
int b = 1;
Swap(a, b);
cout << "a = " << a << " " << "b = " << b << endl;
double c = 0.01;
double d = 0.02;
Swap<double>(c, d);
cout << "c = " << c << " " << "d = " << d << endl;
return 0;
}
泛型编程在c++的第二个应用
c++中的类模板
-以相同的方式处理不同的类型
-在类声明前使用template进行标识
-用于说明类中使用的泛指类型T
类模板的具体使用
-只能显示指定具体类型 ,无法自动推导
-使用具体类型 定义对象
实验:类模板
#include <iostream>
using namespace std;
template <typename T>
void Swap(T& a, T& b)
{
T t = a;
a = b;
b = t;
}
template <typename T>
class Op
{
public:
T process(T v)
{
return v * v;
}
};
int main()
{
Op<int> opInt; //定义对象
Op<double> opDouble;
cout << "5 * 5 = " << opInt.process(5) << endl;
cout << "0.3 * 0.3 = " << opDouble.process(0.3) <<endl;
return 0;
}
小结
模板是泛型编程理论在c++中的实现
函数模板支持参数的自动推导和显示指定
类模板在使用时只能显示指定类型
类模板非常适用于编写数据结构相关的代码