【數據結構實戰C++】8 泛型編程

【數據結構實戰C++】8 泛型編程

作者 CodeAllen ,轉載請註明出處


數據結構的特點

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

也就是說數據結構並不關注數據元素的具體類型(這個是很關鍵的一個概念)

如何爲數據結構的學習選擇合適的編程語言?

從上邊的分析可以知道,支持泛型編程的語言最適合學習數據結構

c++是支持泛型編程的,其中的模板就是泛型編程

泛型編程概念
-不考慮具體數據類型的編程方式

對於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 = 1;

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 = t;
}
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;
    Swap<double>(c, d);
    cout << "c = " << c << " " << "d = " << d << endl;
    return 0;
}

泛型編程在c++的第二個應用
c++中的類模板

-以相同的方式處理不同的類型
-在類聲明前使用template進行標識
-用於說明類中使用的泛指類型T
在這裏插入圖片描述

類模板的具體使用
-只能顯示指定具體類型 ,無法自動推導
-使用具體類型 定義對象
在這裏插入圖片描述

實驗:類模板

#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()
{
    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;
}

小結
模板是泛型編程理論在c++中的實現
函數模板支持參數的自動推導和顯示指定
類模板在使用時只能顯示指定類型
類模板非常適用於編寫數據結構相關的代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章