数据结构课程的特点
- 专注数据元素之间的关系
- 专注于特定结构之上的算法
数据结构课程并不关注数据元素的具体类型
。
问题:如何为数据结构的学习选择合适的语言
经验分享:支持泛型编程的语言最适合数据结构课程的学习
泛型编程的概念
- 不考虑具体数据类型的编程方式
对于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 = 0;
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 = a;
}
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;
cout << "c = " << c << " " << "d = " << d << endl;
return 0;
}
输出:
a = 1 b = 1
c = 0.01 d = 0.02
C++ 中的类模板
- 以相同的方式处理不同的类型
- 在类声明前使用 template 进行标识
- <typename T> 用于说明类中使用的泛指类型T
template <typename T>
class Operator
{
public:
T op(T a, T b);
}
类模板的使用
- 只能显示指定具体类型,无法自动推导
- 使用具体类型 <Type> 定义对象
Operator<int> op1;
Operator<string> op2;
int i = op1.op(1, 2);
string s = op2.op("D.T", "Software");
编程实验
#include <iostream>
using namespace std;
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;
}
输出:
5 * 5 = 25
0.3 * 0.3 = 0.09
小结
- 模板是泛型编程理论在C++中的实现
- 函数模板支持参数的自动推导和显示指定
- 类模板在使用时只能显示指定类型
- 类模板非常适用于编写数据结构相关的代码
以上内容整理于狄泰软件学院系列课程,请大家保护原创!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。