數組類模板(四十九)
阿新 • • 發佈:2018-06-02
數組類 類模板 數值型模板參數 之前我們學習了類模板,今天我們來看看數組類模板。模板參數可以是數值型參數(非類型參數),如下
使用數值型模板參數是有限制的,如:a> 變量不能作為模板參數;b> 浮點數不能作為模板參數;c> 類對象不能作為模板參數。其本質是模板參數是在編譯階段被處理的單元,因此在編譯階段必須準確無誤的唯一確定。
下來我們用函數模板來實現一個面試題:用最高效的方法求 1+2+3+...+N 的值。
#include <iostream> #include <string> using namespace std; template < typename T, int N > void Func() { T a[N] = {0}; for(int i=0; i<N; i++) { a[N] = i + 1; } for(int i=0; i<N; i++) { cout << a[i] << endl; } } template < int N > class Sum { public: static const int VALUE = Sum<N-1>::VALUE + N; }; template < > class Sum < 1 > { public: static const int VALUE = 1; }; int main() { cout << "1+2+3+...+10 = " << Sum<10>::VALUE << endl; cout << "1+2+3+...+100 = " << Sum<100>::VALUE << endl; return 0; }
我們通過用函數模板來實現遞歸的定義,遞歸的出口為它的完全特化為 1 時。下來我們來看看編譯結果
我們看到已經實現了這個功能。下來我們再來實現數組類的模板
Array.h 源碼
#ifndef _ARRAY_H_ #define _ARRAY_H_ template < typename T, int N > class Array { T m_array[N]; public: int length(); bool set(int index, T value); bool get(int index, T& value); T& operator[] (int index); T operator[] (int index) const; virtual ~Array(); }; template < typename T, int N > int Array<T, N>::length() { return N; } template < typename T, int N > bool Array<T, N>::set(int index, T value) { bool ret = (0 <= index) && (index < N); if( ret ) { m_array[index] = value; } return ret; } template < typename T, int N > bool Array<T, N>::get(int index, T& value) { bool ret = (0 <= index) && (index < N); if( ret ) { value = m_array[index]; } return ret; } template < typename T, int N > T& Array<T, N>::operator[] (int index) { return m_array[index]; } template < typename T, int N > T Array<T, N>::operator[] (int index) const { return m_array[index]; } template < typename T, int N > Array<T, N>::~Array() { } #endif
Test.cpp 源碼
#include <iostream> #include <string> #include "Array.h" using namespace std; int main() { Array<double, 5> ad; for(int i=0; i<ad.length(); i++) { ad[i] = i * i; } for(int i=0; i<ad.length(); i++) { cout << ad[i] << endl; } return 0; }
我們來看看編譯結果
我們看到已經正確地實現了數組類的創建。下來我們再來完善下之前寫的 IntArray 類。
HeapArray.h 源碼
#ifndef _HEAPARRAY_H_ #define _HEAPARRAY_H_ template < typename T > class HeapArray { private: int m_length; T* m_pointer; HeapArray(int len); bool construct(); public: static HeapArray<T>* NewInstance(int length); int length(); bool get(int index, T& value); bool set(int index, T value); T& operator [] (int index); T operator [] (int index) const; HeapArray<T>& self(); ~HeapArray(); }; template < typename T > HeapArray<T>::HeapArray(int len) { m_length = len; } template < typename T > bool HeapArray<T>::construct() { m_pointer = new T[m_length]; return m_pointer != NULL; } template < typename T > HeapArray<T>* HeapArray<T>::NewInstance(int length) { HeapArray<T>* ret = new HeapArray<T>(length); if( !(ret && ret->construct()) ) { delete ret; ret = 0; } return ret; } template < typename T > int HeapArray<T>::length() { return m_length; } template < typename T > bool HeapArray<T>::get(int index, T& value) { bool ret = (0 <= index) && (index <= length()); if( ret ) { value = m_pointer[index]; } return ret; } template < typename T > bool HeapArray<T>::set(int index, T value) { bool ret = (0 <= index) && (index <= length()); if( ret ) { m_pointer[index] = value; } return ret; } template < typename T > T& HeapArray<T>::operator [] (int index) { return m_pointer[index]; } template < typename T > T HeapArray<T>::operator [] (int index) const { return m_pointer[index]; } template < typename T > HeapArray<T>& HeapArray<T>::self() { return *this; } template < typename T > HeapArray<T>::~HeapArray() { delete[] m_pointer; } #endif
Test.cpp 源碼
#include <iostream> #include <string> #include "HeapArray.h" using namespace std; int main() { HeapArray<int>* pai = HeapArray<int>::NewInstance(10); if( pai != NULL ) { HeapArray<int>& ai = pai->self(); for(int i=0; i<ai.length(); i++) { ai[i] = i + 1; } for(int i=0; i<ai.length(); i++) { cout << ai[i] << endl; } } delete pai; return 0; }
我們編譯下看看結果
我們再來試試 char 類型呢,打印 a 以後的 10 個字母
我們看到也已正確實現了,這便證明了我們寫的數組類模板是能實現各種數據類型的。通過對數組類模板的學習,總結如下:1、模板參數可以是數值型參數;2、數組型模板參數必須在編譯期間唯一確定;3、數組類模板是基於數值型模板參數實現的;4、數組類模板是簡易的線性表數據結構。
歡迎大家一起來學習 C++ 語言,可以加我QQ:243343083。
數組類模板(四十九)