【數據結構】8_泛型編程簡介

數據結構課程的特色

  • 專一數據元素之間的關係
  • 專一於特定結構之上的算法

數據結構課程並不關注數據元素的具體類型ios


問題:如何爲數據結構的學習選擇合適的語言

經驗分享:支持泛型編程的語言最適合數據結構課程的學習算法

泛型編程的概念

  • 不考慮具體數據類型的編程方式

對於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 關鍵字用於聲明泛指類型

image.png

函數模板的使用

  • 自動類型推導調用
  • 具體類型顯示調用
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++中的實現
  • 函數模板支持參數的自動推導和顯示指定
  • 類模板在使用時只能顯示指定類型
  • 類模板很是適用於編寫數據結構相關的代碼

以上內容整理於狄泰軟件學院系列課程,請你們保護原創!spa

相關文章
相關標籤/搜索