之前我们学习了类模板,今天我们来看看数组类模板。模板参数可以是数值型参数(非类型参数),如下
创新互联成立以来不断整合自身及行业资源、不断突破观念以使企业策略得到完善和成熟,建立了一套“以技术为基点,以客户需求中心、市场为导向”的快速反应体系。对公司的主营项目,如中高端企业网站企划 / 设计、行业 / 企业门户设计推广、行业门户平台运营、app软件开发、手机网站开发、微信网站制作、软件开发、西信服务器托管等实行标准化操作,让客户可以直观的预知到从创新互联可以获得的服务效果。使用数值型模板参数是有限制的,如:a> 变量不能作为模板参数;b> 浮点数不能作为模板参数;c> 类对象不能作为模板参数。其本质是模板参数是在编译阶段被处理的单元,因此在编译阶段必须准确无误的唯一确定。
下来我们用函数模板来实现一个面试题:用最高效的方法求 1+2+3+...+N 的值。
#include#include using namespace std; template < typename T, int N > void Func() { T a[N] = {0}; for(int i=0; i class Sum { public: static const int VALUE = Sum ::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::length() { return N; } template < typename T, int N > bool Array ::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 ::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 ::operator[] (int index) { return m_array[index]; } template < typename T, int N > T Array ::operator[] (int index) const { return m_array[index]; } template < typename T, int N > Array ::~Array() { } #endif
Test.cpp 源码
#include#include #include "Array.h" using namespace std; int main() { Array ad; for(int i=0; i 我们来看看编译结果
我们看到已经正确地实现了数组类的创建。下来我们再来完善下之前写的 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* 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 & self(); ~HeapArray(); }; template < typename T > HeapArray ::HeapArray(int len) { m_length = len; } template < typename T > bool HeapArray ::construct() { m_pointer = new T[m_length]; return m_pointer != NULL; } template < typename T > HeapArray * HeapArray ::NewInstance(int length) { HeapArray * ret = new HeapArray (length); if( !(ret && ret->construct()) ) { delete ret; ret = 0; } return ret; } template < typename T > int HeapArray ::length() { return m_length; } template < typename T > bool HeapArray ::get(int index, T& value) { bool ret = (0 <= index) && (index <= length()); if( ret ) { value = m_pointer[index]; } return ret; } template < typename T > bool HeapArray ::set(int index, T value) { bool ret = (0 <= index) && (index <= length()); if( ret ) { m_pointer[index] = value; } return ret; } template < typename T > T& HeapArray ::operator [] (int index) { return m_pointer[index]; } template < typename T > T HeapArray ::operator [] (int index) const { return m_pointer[index]; } template < typename T > HeapArray & HeapArray ::self() { return *this; } template < typename T > HeapArray ::~HeapArray() { delete[] m_pointer; } #endif Test.cpp 源码
#include#include #include "HeapArray.h" using namespace std; int main() { HeapArray * pai = HeapArray ::NewInstance(10); if( pai != NULL ) { HeapArray & ai = pai->self(); for(int i=0; i 我们编译下看看结果
我们再来试试 char 类型呢,打印 a 以后的 10 个字母
我们看到也已正确实现了,这便证明了我们写的数组类模板是能实现各种数据类型的。通过对数组类模板的学习,总结如下:1、模板参数可以是数值型参数;2、数组型模板参数必须在编译期间唯一确定;3、数组类模板是基于数值型模板参数实现的;4、数组类模板是简易的线性表数据结构。
欢迎大家一起来学习 C++ 语言,可以加我QQ:243343083。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
分享标题:数组类模板(四十九)-创新互联
标题链接:http://jkwzsj.com/article/dpgcis.html