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