C++筆記 第六十課 陣列類模板---狄泰學院
阿新 • • 發佈:2018-12-01
如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux
第六十課 陣列類模板
1.預備知識
模板引數可以是數值型引數(非型別引數)
數值型模板引數的限制
變數不能作為模板引數
浮點數不能作為模板引數
類物件不能作為模板引數
。。。
本質:模板引數是在編譯階段被處理的單元,因此,在編譯階段必須準確無誤的唯一確定。
2.有趣的面試題
用你覺得最高效的方法求1+2+3+…+N的值!
60-1 數值型模板引數
#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[i] = i; } 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 + 2 + 3 + ... + 10 = 55 1 + 2 + 3 + ... + 100 = 5050
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
60-2.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; } 執行結果 0 1 4 9 16
HeapArray.h 堆陣列模板類
34課的內容知識的改寫:Array.h+HeapArray.h+60-3.cpp
60-3.cpp
#include<iostream>
#include<string>
#include "Array.h"
#include "HeapArray.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;
}
cout << endl;
HeapArray<char>* pai = HeapArray<char>::NewInstance(10);
if( pai != NULL )
{
HeapArray<char>& ai = pai->self();
for(int i=0; i<ai.length(); i++)
{
ai[i] = i + 'a';
}
for(int i=0; i<ai.length(); i++)
{
cout << ai[i] << endl;
}
}
delete pai;
return 0;
}
HeapArray.h
#ifndef _HEAPARRAY_H_
#define _HEAPARRAY_H_
template
<typename T>
class HeapArray
{
private:
int m_length;
T* m_pointer;
HeapArray(int len);
HeapArray(const HeapArray<T>& obj);
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();//Return to itself
~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
執行結果
0
1
4
9
16
a
b
c
d
e
f
g
h
i
j
小結
模板引數可以是數值型引數
數值型模板引數必須在編譯期間唯一確定
陣列類模板是基於數值型模板引數實現的
陣列類模板是建議的線性表資料結構