博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C++】 60_数组类模板
阅读量:5884 次
发布时间:2019-06-19

本文共 4378 字,大约阅读时间需要 14 分钟。

预备知识

  • 模板参数可以是数值型参数(非类型参数)
template< typename T, int N >void func(){    T a[N];                  // 使用模板参数定义局部数组}
func
();
  • 数值型模板参数的限制

    • 变量不能作为模板参数
    • 浮点数不能作为模板参数
    • 类对象不能作为模板参数
    • ......

本质:

模板参数是在编译阶段被处理的单元,因此,在编译阶段必须准确无误的唯一确定

有趣的面试题:

用你觉得最高效的方法求 1 + 2 + 3 + ... + N 的值!

编程实验: 数值类模板参数

#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 + 2 + 3 + ... + 10 = 551 + 2 + 3 + ... + 100 = 5050

编程实验: 数组模板类

Array.h

#ifndef _ARRAY_H_#define _ARRAY_H_template< typename T, int N >class Array{private:    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();                 // 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 = (index >=0) && (index < N); if( ret ) { m_array[index] = value; } return ret;}template< typename T, int N >bool Array
::get(int index, T& value){ bool ret = (index >=0) && (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

main.cpp

#include 
#include "Array.h"using namespace std;int main(){ Array
ad; for(int i=0; i
输出:014916

编程实验: 堆数组模板类

HeapArray.h

#ifndef _HEAPRRAY_H_#define _HEAPARRAY_H_template< typename T >class HeapArray{private:    int m_length;    T* m_pointer;        HeapArray(int len);    HeapArray(const HeapArray& obj);    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& operator = (const HeapArray& obj);    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 = (index >= 0) && (index < length()); if( ret ) { value = m_pointer[index]; } return ret;}template< typename T >bool HeapArray
::set(int index, T value){ bool ret = (index >= 0) && (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
:: operator = (const HeapArray
& obj){ if( this != &obj ) { T* pointer = new T[obj.m_length]; if( pointer ) { for(int i=0; i
HeapArray
& HeapArray
::self(){ return *this;}template< typename T >HeapArray
::~HeapArray(){ delete[] m_pointer;}#endif

main.cpp

#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
输出:abcdefghij

小结

  • 模板参数可以是数值类型
  • 数值型模板参数必须在编译期间唯一确定
  • 数组类模板是基于数值型模板参数实现的
  • 数组类模板是简易的线性表数据结构

以上内容参考狄泰软件学院系列课程,请大家保护原创!

转载地址:http://jelix.baihongyu.com/

你可能感兴趣的文章
mariadb启动报错:[ERROR] Can't start server : Bind on unix socket: Permission denied
查看>>
nginx的信号量
查看>>
云im php,网易云IM
查看>>
河南农业大学c语言平时作业答案,河南农业大学2004-2005学年第二学期《C语言程序设计》期末考试试卷(2份,有答案)...
查看>>
c语言打开alist文件,C语言 文件的打开与关闭详解及示例代码
查看>>
c语言 中的共用体和结构体如何联合定义,结构体(Struct)、联合体(Union)和位域
查看>>
SDL如何嵌入到QT中?!
查看>>
P1026 统计单词个数
查看>>
[js高手之路] html5 canvas系列教程 - 状态详解(save与restore)
查看>>
poi excel 常用api
查看>>
AD提高动态的方法(附SNR计算)
查看>>
[转]轻松实现可伸缩性,容错性,和负载平衡的大规模多人在线系统
查看>>
五 数组
查看>>
也谈跨域数据交互解决方案
查看>>
EntityFramework中使用Include可能带来的问题
查看>>
面试题28:字符串的排列
查看>>
css important
查看>>
WPF 实现窗体拖动
查看>>
来自维基百科程序员Brandon Harris
查看>>
NULL不是数值
查看>>