c++数组类模板的实现

1、预备知识

(1)模板参数不仅仅可以是类型参数,还可以是数值型参数。

如:

template

<typename T, int N>//int N就是数值型参数, 要注意这个int类型,因为这里要注意数值型参数的限制,下面有说数值型参数的限制。

void func()

{

T a[N];//使用模板参数来定义局部数组,模板的数值型参数来表示数组的大小。

}

func<double, 10>();//这样进行使用,数值型参数,也就是第二个参数要是常量,因为这是数值型模板参数的限制造成的。

数值型模板参数的限制:变量不能最为模板参数,浮点数不能作为模板参数,类对象不能作为模板参数等。

本质:模板参数是在编译阶段被处理的单元,这点毋庸置疑,因为编译器会首先对模板进行编译,因此,在编译阶段必须准确无误的唯一确定,变量是不能够在编译阶段进行确定的,所以变量

不可以作为模板参数,浮点数因为在计算机的内存中是不精确的,所以C++中不允许浮点数作为模板参数。类对象也不能在编译的时候进行唯一的确定,因为它其实就是一个变量,类的变量摆了。

(2)一道面试题,用你觉得最高效的方法求得1+到N的数值。

template

< int N >//数值型模板参数的函数类模板

class Sum

{

public:

static const int VALUE = Sum<N-1>::VALUE + N;

};

template

< >完全特化

class Sum< 1 >

{

static const int VALUE = 1;

};

int main(void)

{

cout << "1 + 2 + 3 + ... + 100 = " <<Sum<100>::VALUE <<endl;

return 0;

}

解释:上面的程序中,类模板用的是数值型参数,这点从模板参数为int就可以看出来,所以我们使用的时候,直接传递数值就行。VALUE是const的,并且有初始化,所以在编译阶段就会取得

VALUE这个常量的值,将其放入符号表中,同时VALUE又被static修饰,所以是放在全局数据区的。当编译器编译到VALUE时,首先就会去获取这个常量的值进而放入符号表中,但是编译器发现

要想取得VALUE的值,首先要取得N-1的值,要想取得N-1的值,要先取得N-1-1的值,知道N为1的时候,编译器发现有这个类的特化,所以就用了这个特化的类,VALUE的值为1,因为有递归规程,

所以在返回的时候,N不断的又+1,每次+1都会将加完的值放到VALUE这个常量中,直到N变到了N为止,也就是又一直加到了N,最后VALUE的值就完全取得完毕了,最后放入了符号表中。

这是一个高效的求和方法。因为编译器在编译的时候,这个VALUE的常量值就已经确定了,我们后面cout去访问这个值的时候,只是相当于直接从符号表中将值取出来,所以高效。

这个高效的方法依赖了类模板技术、类模板完全特化技术、还依赖了类模板参数为数值型参数的技术,还依赖了对const和static的理解。有了static才可以用作用域分辨符去访问这个VALUE,

有了const才会在编译阶段将值确定,因为常量的值是在编译阶段确定的。

时间: 2024-10-12 19:26:29

c++数组类模板的实现的相关文章

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作为一个最原始基类,不允许

数组类模板(四十九)

之前我们学习了类模板,今天我们来看看数组类模板.模板参数可以是数值型参数(非类型参数),如下 使用数值型模板参数是有限制的,如:a> 变量不能作为模板参数:b> 浮点数不能作为模板参数:c> 类对象不能作为模板参数.其本质是模板参数是在编译阶段被处理的单元,因此在编译阶段必须准确无误的唯一确定. 下来我们用函数模板来实现一个面试题:用最高效的方法求 1+2+3+...+N 的值. #include <iostream> #include <string> usin

数组类模板(中)

#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; //数组

数组类模板(上)------一种高效的使用

预备知识模板参数可以是数值型参数(非类型参数)template<typename T, int N>void func(){ T a[N]; //使用模板参数定义局部数组}func<double, 10>(); 数值型模板参数的限制-变量不能作为模板参数(变量是不能在编译期就唯一确定的)-浮点数不能作为模板参数(浮点数在计算机内部的表示是不精确的)-类对象不能作为模板参数 ........ 本质:模板参数是在编译阶段被处理的单元,因此,在编译阶段必须准确无误的唯一确定 #inclu

C++——模板、数组类

1.函数模板:可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计. 声明方法:template<typename 标识符> 函数声明 求绝对值的模板 #include<iostream>               --编译器从调用abs函数时实参的类型,推导出函数模板的类型参数.using namespace std;             --如该题从调用abs(int)推导出模板中类型参数T为int型. template<typenam

模板类与类模板、函数模板与模板函数等的区别

在C++中有好几个这样的术语,但是我们很多时候用的并不正确,几乎是互相替换混淆使用.下面我想彻底辨清几个术语,这样就可以避免很多概念上的混淆和使用上的错误.这几个词是: 函数指针——指针函数 数组指针——指针数组 类模板——模板类 函数模板——模板函数 最终在使用中,我们就可以让它们实至名归,名正言顺. 1.函数指针——指针函数   函数指针的重点是指针.表示的是一个指针,它指向的是一个函数,例子: int   (*pf)(); 指针函数的重点是函数.表示的是一个函数,它的返回值是指针.例子: