数组类模板(四十九)

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

使用数值型模板参数是有限制的,如: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。

原文地址:http://blog.51cto.com/12810168/2123381

时间: 2024-12-12 21:11:00

数组类模板(四十九)的相关文章

QT开发(四十九)——数据库用户接口层

QT开发(四十九)--数据库用户接口层 用户接口层主要包括Qt SQL模块中的QSqlQueryModel.QSqlTableModel.QSqlRelationalTableModel.用户接口层的类实现了将数据库中的数据链接到窗口部件上,是使用模型/视图框架实现的,是更高层次的抽象,即便不熟悉SQL也可以操作数据库.需要注意的是,在使用用户接口层的类之前必须先实例化QCoreApplication对象. QT中使用了自己的机制来避免使用SQL语句,提供了更简单的数据库操作及数据显示模型,分别

无限互联奖学金文章连载北京总部四十九期胡梦川 第一篇

无限互联奖学金文章连载北京总部四十九期胡梦川 第一篇: 今天是来到无限互联的第四天,严格来说已经第六天了,刚来就是开班典礼,给人一种很好的氛围.老师讲了很多关于以后学习的技巧和规定,我的第一感觉是,比备战高考还要严格,不过这才能体现一个组织的负责任.正式开讲才感觉到这个班级的大神无处不在,不努力根本赶不上,就是这个学习氛围和高强度的练习很重要.多用心你才能感觉到有些事其实很简单.关于学习时间大家基本都是一天不动的在敲代码,等于给自己一个机会吧.时间飞逝,抓住机会才重要.刚来第一周,感受最深就是好

C++数组类模板(堆内存)

#ifndef _HEAP_ARRAY_H_ #define _HEAP_ARRAY_H_ /* * why * 2016/9/5 15:18 * 实现了一个较完善的数组类模板,在堆空间上 */ template < typename T > class Heap_Array { private: T *m_array; int array_len; Heap_Array(int len);//构造函数 设置一个数组的长度,并且将数组元素值全清0 // Heap_Array(const Hea

网易云课堂_C++程序设计入门(下)_第10单元:月映千江未减明 – 模板_第10单元 - 单元作业:OJ编程 - 创建数组类模板

第10单元 - 单元作业:OJ编程 - 创建数组类模板 查看帮助 返回 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩. 本单元作业练习创建模板类.单元作业会涉及冒泡排序.线性查找等算法.如果对排序.查找不熟悉,可以自行baidu或者google 依照学术诚信条款,我保证此作业是本人独立完成的. 1 编写一个数组类模板 Array,能够存储不同类型的数组元素.对数组元素进行查找.

c++数组类模板(栈内存)

#ifndef _ARRAY_H_ #define _ARRAY_H_ /* * 实现一个数组类模板,在栈上 * why * 2016/9/5 */ template < typename T, int N > class Array { private: T m_array[N]; public: int length(); //获取数组长度 bool set_array(T value, int index);  //设置数组元素内容 bool get_array(T& value

C++数组类模板

* 作为数组类模板,肯定没有vector做得好,但是普通的数组有1个好处就是能直接操作内存,vector在这方面就不是很方便了.网上虽然也有数组类模板,多维的设计基本上都不是很好.我这个类模板多维的设计借鉴了vector,如2维数组vector<vector<int>> vvArr;下附源码*/ #pragma once enum E_POSIITION { begin_position = 0, end_position }; // CBaseArray作为一个最原始基类,不允许

第四十九象 壬子

第四十九象 壬子 谶 曰山谷少人口 欲剿失其巢帝王称弟兄 纷粉是英豪 颂 曰一个或人口内啼分南分北分东西六爻占尽文明见棋布星罗日月济 金圣叹注解:久分必合,久合必分,理数然也,然有文明之象,当不如割据者之纷扰也. 推背图网解: 解图八把刀,显然八位能人各居一方.刀非指武力统治,下文有“文明”象,这里刀在八卦中表兑卦,兑为口,显然是通过舆论宣传法律.社会公德在治理各自的“行政区”. 解谶山谷少人口 欲剿失其巢——“谷”字少了人.口剩下“八”:“剿”少了巢剩下“刀”旁,暗示割据自治有八方.  帝王称

鲁迅散文——随感录四十九

随感录四十九 凡有高等动物,倘若没有遇着意外的变故,总是从幼到壮,从壮到老,从老到死. 我们从幼到壮,既然毫不为奇的过去了:自此以后,自然也该毫不为奇的过去. 可惜有一种人,从幼到壮,居然也毫不为奇的过去了:从壮到老,便有点古怪:从老到死,却更是奇想天开,要占尽了少年的道路,吸尽了少年的空气. 少年在这时候,只能先行萎黄,且待将来老了,神经血管一切变质以后,再来活动.所以社会上的状态,先是"少年老成":直待弯腰曲背时期,才更加"逸兴遄飞",似乎从此以后,才上了做人的

第四十九章

第四十九章1 圣人无心,将心比心 圣人恒无心,以百姓之心为心. 优秀的领导者自己的心是空的,把老百姓的心作为自己的心. 领导者要换位思考,想老板姓所想.要学会将心比心. 各位朋友大家好,今天我们接着来聊<道德经>. 不知道各位双十一过得怎么样?大家都买了很多东西吧?双十一那天我开玩笑,我发一个微博,我还在自己朋友圈里发了个微信,在我朋友圈说,双十一大酬宾了,我讲的<道德经>200多期,全部今天免费.我是搞笑,结果真有的网友留言,真的吗?太好了,我一看我晕了,我说我是开玩笑,他真的一