您的位置:首页 > 理论基础 > 数据结构算法

【数据结构学习之完全从零实现所有数据结构的代码编写之一】泛型编程简介

2018-01-17 01:41 246 查看
今天开始系统性学习数据结构内容,之前也看过大话数据结构这本书,对大多数概念以及数据结构都有一定的了解,但是就是没有自己亲自去实现它的代码。

今天开始,用C++语言从0编写数据结构所有的代码实现,学习的编程工具为QT。也希望同道中人可以加q:1126137994.共同学习进步。

今天第一次先不讲数据结构的知识,先告诉大家为什么用C++语言来学习数据结构。

为什么用C++语言来学习数据结构呢?

首先我们来看一下数据结构的特点:

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

-专注于特定结构之上得算法

我们发现数据结构并不关注数据元素的具体类型。既然它不关注数据元素的具体类型,那么泛型编程,再适不过了。那么什么是泛型编程呢?

泛型编程的概念:不考虑具体数据类型的编程方式。

举个例子:

对于Swap函数,可以考虑下面的泛型写法

void Swap(T& a,T& b)
{
T t = a;
a = b;
b = t;
}


Swap泛型写法中的T,不是一个具体的数据类型,而是泛指任意的数据类型。

学过C++语言的应该就会发现,C++中的模板技术,不就是泛型编程么?

C++中的函数模板:

-一种特殊的函数可用不同类型进行调用

-看起来和普通函数类似,区别是类型可被参数化。

函数模板的语法法则:

*template关键字用于声明开始进行泛型编程

*typename关键字用于声明泛指类型



类模板的语法法则:

*以相同的方式处理不同的类型

*在类声明前使用template关键字进行标识

*
<typename T>
用于说明类中使用的泛指类型T

例如:

template <typename T>
class Operator
{
public:
T op(T a, T b);
};


如何使用模板?

1.函数模板的使用

-自动类型推倒调用

-具体类型显示调用

例如:

int a = 0;
int b = 1;
Swap(a, b);  //自动推倒数据类型
float c = 0.1;
float d = 0.2;
Swap<float>(c, d); //显示的调用具体的数据类型


2.类模板的使用

-只能显示指定具体的数据类型,无法自动推倒

-使用具体类型
<type>
定义对象

例如:

Operator<int> op1;
Operator<string> op2;

int i = op1.op(1, 2);
string s = op2.op("lyy", "C++");


下面看一个完整的代码:

#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()
{
int a = 1;
int b = 2;
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;

Op<int> opInt; //类定义对象时,必须加<type>特定的类型定义
Op<double> opDouble; //类定义对象时,必须加<type>特定的类型定义

cout << "5*5 = " << opInt.process(5) << endl;
cout << "0.3*0.3 = " << opDouble.process(0.3) << endl;

return 0;
}


在QT上运行的结果为:



总结:

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

-函数模板支持参数的自动推倒和显示指定

-类模板在使用时只能显示的指定类型

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

想一起探讨以及获得各种学习资源加我(有我博客中写的代码的原稿):

qq:1126137994

微信:liu1126137994

可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  泛型编程
相关文章推荐