学习交流加
- 个人qq:
1126137994- 个人微信:
liu1126137994- 学习交流资源分享qq群:
962535112
今天开始系统性学习数据结构内容,之前也看过大话数据结构这本书,对大多数概念以及数据结构都有一定的了解,但是就是没有自己亲自去实现它的代码。
今天开始,用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语言,数据结构等技术问题。