第八课 泛型编程简介

数据结构课程的特点:

  专注于数据元素之间的关系

  专注于特定结构之上的算法

数据结构课程并不关注数据元素的具体类型

既然数据结构只关心数据元素之间的关系,我们只需要抽象的考虑数据元素之间的关系以及算法,不用关心具体的数据类型,因此,支持泛型编程的语言最适合数据结构的学习。因此,我们重点关注C++中的模板编程。

不考虑数据类型的编程方式:

C++中的函数模板:

template<typename T>是C++中特有的声明函数模板的方式。

函数模板的语法规则:

有了template <typename T>的声明,编译器就知道T是一个类型,就会把它当做一个类型处理。

函数模板的使用:

自动类型推导调用

具体类型显式调用

  int a = 0;

  int b = 1;

  Swap(a, b); //自动推导

  float c = 2;

  float d = 3;

  Swap<float>(c, d);  //显式调用

 函数模板示例程序如下:

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 template <typename T>
 6 void Swap(T& a, T& b)
 7 {
 8     T t = a;
 9     a = b;
10     b = t;
11 }
12 
13 int main(int argc, char *argv[])
14 {
15     int a = 2;
16     int b = 1;
17 
18     Swap(a, b);
19 
20     cout << "a = " << a << " " << "b = " << b << endl;
21 
22     double c = 0.01;
23     double d = 0.02;
24 
25     Swap<double>(c, d);
26 
27     cout << "c = " << c << " " << "d = " << d << endl;
28     return 0;
29 }

运行结果如下:

使用模板我们不必指明具体类型,因此,学习数据结构时,我们完全可以用一个模板描述一个具体的算法。调用的时候再指定处理元素的具体类型。

C++中的类模板:

类模板的应用:

  只能显式指定具体类型,无法自动推导。

  使用具体类型<Type>定义对象。

  Operator<int> op1;

  Operator<double> op2;

  int i = op1.op(1, 2);

  double d  = op2.op(0.01, 0.02);

类模板示例程序如下:

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 
 6 template <typename T>
 7 class Op
 8 {
 9 public:
10     T process(T v)
11     {
12         return v * v;
13     }
14 };
15 
16 int main(int argc, char *argv[])
17 {
18     Op<int> opInt;
19     Op<double> opDouble;
20 
21     cout << "5 * 5 = " << opInt.process(5) << endl;
22     cout << "0.3 * 0.3 = " << opDouble.process(0.3) << endl;
23 
24     return 0;
25 }

执行结果如下:

小结:

  模板是泛型编程理论在C++中的实现

  函数模板支持参数的自动推导和显式指定

  类模板在使用时只能显式指定类型

  类模板非常适用于编写数据结构相关的代码

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9496044.html