学习交流加

  • 个人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语言,数据结构等技术问题。