模板機制
模板機制使得程序員不需要關心參數的數據類型,只用專注於實現算法,將數據類型與算法抽象分離,是可以提升編碼效率的好東西。
上一篇【C++ 模板函數 講解及實現】介紹瞭如何使用函數模板來簡化編程,今天來介紹類模板
類模板介紹
類模板在實現一些數據結構的時候經常使用,因爲數據結構告訴我們不需要關心實際存儲的數據類型,而是專注於存儲的方式。
如果我們希望實現一個數組類,用來存儲int元素,我們可以很快實現
class myArray
{
public:
int data[10];
int len;
myArray(){}
int& operator [] (int index){return data[index];}
};
可是我們發現如果我們希望存儲double元素,就得重新修改上述的類,這非常麻煩
class myArray
{
public:
double data[10];
int len;
myArray(){}
double& operator [] (int index){return data[index];}
};
可是注意到修改的地方只有數據類型,其他的操作一律不用修改
和函數模板中的問題類似,我們希望有一種通用的定義方式,來使得類的定義變得靈活。類模板提供了這種功能的實現
類模板實現
template關鍵字
和函數模板類似,類模板同樣使用template關鍵字,用template<class TYPE>
括號中的數據類型TYPE
來抽象的表示類實現時的數據類型
比如實現一個可以裝載任何數據類型的數組類myArray
template<class TYPE>
class myArray
{
public:
TYPE data[10];
int len;
myArray(){}
TYPE& operator [] (int index){return data[index];}
};
實例化
因爲模板類事先不知道template括號中的數據類型是什麼,所以在實例化一個模板類的時候,我們往往要給出對應的數據類型
比如實例化上述的myArray類,使用int作爲數據類型,只需要在尖括號中寫入對應的類型名即可(這個類型名也可以是自定義數據類型)
myArray<int> arr;
一個例子
通過模板類實現一個簡單的數組以存儲任何數據類型
#include <bits/stdc++.h>
using namespace std;
template<class TYPE>
class myArray
{
public:
TYPE data[10];
int len;
myArray(){}
TYPE& operator [] (int index){return data[index];}
};
int main()
{
myArray<int> arr;
arr.len = 3;
for(int i=0; i<3; i++)
{
int x; cin>>x;
arr[i] = x;
}
for(int i=0; i<3; i++) cout<<arr[i]<<" "; cout<<endl;
return 0;
}
上述main函數中,使用int來實例化模板類,組成int數組
如果我們使用string類來實例化,就會得到存儲字符串的數組
myArray<string> arr;
arr.len = 3;
for(int i=0; i<3; i++)
{
string x; cin>>x;
arr[i] = x;
}
for(int i=0; i<3; i++) cout<<arr[i]<<" "; cout<<endl;
多個類型的模板類
有時候實現一個模板類,可能會用到多個數據類型。
比如我們要實現一個【鍵值對】,鍵的數據類型爲A,對應的值的數據類型爲B,(其實就是C++的pair類模板)
template<class TYPE1, class TYPE2>
class keyValuePair
{
public:
TYPE1 key;
TYPE2 value;
keyValuePair(){}
keyValuePair(TYPE1 k, TYPE2 v){key=k; value=v;}
friend ostream& operator << (ostream& os, keyValuePair& p)
{
os<<p.key<<" - "<<p.value<<endl;
}
};
main函數
keyValuePair<int, double> p1(123, 456.78); cout<<p1;
keyValuePair<char, string> p2('Z', "hello"); cout<<p2;
keyValuePair<int, int> p3(12345, 67890); cout<<p3;