之前我们学习了类模板,今天我们来看看数组类模板。模板参数可以是数值型参数(非类型参数),如下

使用数值型模板参数是有限制的,如:a> 变量不能作为模板参数;b> 浮点数不能作为模板参数;c> 类对象不能作为模板参数。其本质是模板参数是在编译阶段被处理的单元,因此在编译阶段必须准确无误的唯一确定。

下来我们用函数模板来实现一个面试题:用最高效的方法求 1+2+3+...+N 的值。

#include<iostream>#include<string>usingnamespacestd;template<typenameT,intN>voidFunc(){Ta[N]={0};for(inti=0;i<N;i++){a[N]=i+1;}for(inti=0;i<N;i++){cout<<a[i]<<endl;}}template<intN>classSum{public:staticconstintVALUE=Sum<N-1>::VALUE+N;};template<>classSum<1>{public:staticconstintVALUE=1;};intmain(){cout<<"1+2+3+...+10="<<Sum<10>::VALUE<<endl;cout<<"1+2+3+...+100="<<Sum<100>::VALUE<<endl;return0;}

我们通过用函数模板来实现递归的定义,递归的出口为它的完全特化为 1 时。下来我们来看看编译结果

我们看到已经实现了这个功能。下来我们再来实现数组类的模板


Array.h 源码

#ifndef_ARRAY_H_#define_ARRAY_H_template<typenameT,intN>classArray{Tm_array[N];public:intlength();boolset(intindex,Tvalue);boolget(intindex,T&value);T&operator[](intindex);Toperator[](intindex)const;virtual~Array();};template<typenameT,intN>intArray<T,N>::length(){returnN;}template<typenameT,intN>boolArray<T,N>::set(intindex,Tvalue){boolret=(0<=index)&&(index<N);if(ret){m_array[index]=value;}returnret;}template<typenameT,intN>boolArray<T,N>::get(intindex,T&value){boolret=(0<=index)&&(index<N);if(ret){value=m_array[index];}returnret;}template<typenameT,intN>T&Array<T,N>::operator[](intindex){returnm_array[index];}template<typenameT,intN>TArray<T,N>::operator[](intindex)const{returnm_array[index];}template<typenameT,intN>Array<T,N>::~Array(){}#endif



Test.cpp 源码

#include<iostream>#include<string>#include"Array.h"usingnamespacestd;intmain(){Array<double,5>ad;for(inti=0;i<ad.length();i++){ad[i]=i*i;}for(inti=0;i<ad.length();i++){cout<<ad[i]<<endl;}return0;}

我们来看看编译结果

我们看到已经正确地实现了数组类的创建。下来我们再来完善下之前写的 IntArray 类。


HeapArray.h 源码

#ifndef_HEAPARRAY_H_#define_HEAPARRAY_H_template<typenameT>classHeapArray{private:intm_length;T*m_pointer;HeapArray(intlen);boolconstruct();public:staticHeapArray<T>*NewInstance(intlength);intlength();boolget(intindex,T&value);boolset(intindex,Tvalue);T&operator[](intindex);Toperator[](intindex)const;HeapArray<T>&self();~HeapArray();};template<typenameT>HeapArray<T>::HeapArray(intlen){m_length=len;}template<typenameT>boolHeapArray<T>::construct(){m_pointer=newT[m_length];returnm_pointer!=NULL;}template<typenameT>HeapArray<T>*HeapArray<T>::NewInstance(intlength){HeapArray<T>*ret=newHeapArray<T>(length);if(!(ret&&ret->construct())){deleteret;ret=0;}returnret;}template<typenameT>intHeapArray<T>::length(){returnm_length;}template<typenameT>boolHeapArray<T>::get(intindex,T&value){boolret=(0<=index)&&(index<=length());if(ret){value=m_pointer[index];}returnret;}template<typenameT>boolHeapArray<T>::set(intindex,Tvalue){boolret=(0<=index)&&(index<=length());if(ret){m_pointer[index]=value;}returnret;}template<typenameT>T&HeapArray<T>::operator[](intindex){returnm_pointer[index];}template<typenameT>THeapArray<T>::operator[](intindex)const{returnm_pointer[index];}template<typenameT>HeapArray<T>&HeapArray<T>::self(){return*this;}template<typenameT>HeapArray<T>::~HeapArray(){delete[]m_pointer;}#endif


Test.cpp 源码

#include<iostream>#include<string>#include"HeapArray.h"usingnamespacestd;intmain(){HeapArray<int>*pai=HeapArray<int>::NewInstance(10);if(pai!=NULL){HeapArray<int>&ai=pai->self();for(inti=0;i<ai.length();i++){ai[i]=i+1;}for(inti=0;i<ai.length();i++){cout<<ai[i]<<endl;}}deletepai;return0;}

我们编译下看看结果

我们再来试试 char 类型呢,打印 a 以后的 10 个字母

我们看到也已正确实现了,这便证明了我们写的数组类模板是能实现各种数据类型的。通过对数组类模板的学习,总结如下:1、模板参数可以是数值型参数;2、数组型模板参数必须在编译期间唯一确定;3、数组类模板是基于数值型模板参数实现的;4、数组类模板是简易的线性表数据结构。


欢迎大家一起来学习 C++ 语言,可以加我QQ:243343083。