C++模板类的示例——数组

目录

分类

一、定长数组:array容器(C++11标准)

(1)普通类的定长array容器,只适用整型

代码

运行结果

注意事项

(2)模板类定长array数组容器,可适用用户定义的数据类型

代码

调试步骤

①在类声明前面加上类模板的标志

②修改类当中用到的数据类型

运行结果

(3)带非通用类型参数的定长array数组容器

代码

调试步骤

①去掉宏定义,使用非通用参数类型类模板

②创建类对象时指定非通用参数类型模板

运行结果

 注意细节

优点

缺点

二、可变数组:vector容器

代码

调试步骤

①变长类数组模板类不需要非通用类型参数,数组大小用成员变量表示,数组动态分配

 ②构造函数从主函数接收一个整型数据,用于初始化数组,动态分配数组空间Vector,并修改len

 ③增加一个扩展数组大小的函数

④重载[ ]访问数组函数,增加扩展数组空间功能

 运行结果

优点


分类

①定长数组:array容器(C++11标准)

②可变数组:vector容器

③类模板的非通用类型参数

一、定长数组:array容器(C++11标准)

(1)普通类的定长array容器,只适用整型

代码

#include<iostream>
using namespace std;
#define MAXLEN 10
class Array
{
	private:
		int items[MAXLEN];
	public:
		Array(){memset(items,0,sizeof(items));
		}
		~Array(){
		}//这个类没有用到堆区内存,析构函数什么都不做
		//在函数中可以判断数组下标ii的合法性
		int& operator[](int ii){return items[ii];}//重载操作符[],形参是数组下标,可以修改数组中的元素
		const int& operator[](int ii)const{return items[ii];}//重载操作符[],形参是数组下标,不可以修改数组中的元素		
};
int main()
{
	Array aa;//创建模板类Array的对象
	aa[0]=5;aa[1]=8;aa[2]=3;aa[3]=2;aa[4]=7;
	for(int ii=0;ii<5;ii++)cout<<"a["<<ii<<"]="<<aa[ii]<<endl;
	return 0;
}

运行结果

注意事项

这个类没有用到堆区(动态分配),用的是栈区,在执行析构函数时系统会自动释放空间,所以析构函数的函数体什么也不做;

(2)模板类定长array数组容器,可适用用户定义的数据类型

代码

#include<iostream>
using namespace std;
#define MAXLEN 10
template <class T>
class Array
{
	private:
		T items[MAXLEN];
	public:
		Array(){memset(items,0,sizeof(items));
		}
		~Array(){
		}//这个类没有用到堆区内存,析构函数什么都不做
		//在函数中可以判断数组下标ii的合法性
		T& operator[](int ii){return items[ii];}//重载操作符[],形参是数组下标,可以修改数组中的元素
		const T& operator[](int ii)const{return items[ii];}//重载操作符[],形参是数组下标,不可以修改数组中的元素		
};
int main()
{
	Array<int>aa;//创建模板类Array的对象
	aa[0]=5;aa[1]=8;aa[2]=3;aa[3]=2;aa[4]=7;
	for(int ii=0;ii<5;ii++)cout<<"a["<<ii<<"]="<<aa[ii]<<endl;
	return 0;
}

调试步骤

①在类声明前面加上类模板的标志

template <class T>

②修改类当中用到的数据类型

运行结果

(3)带非通用类型参数的定长array数组容器

代码

#include<iostream>
#include<string.h>
using namespace std;

template <class T,int len=10>//非通用类型参数,可以有缺省值
class Array
{
	private:
		T items[len];
	public:
		Array(){memset(items,0,sizeof(items));
		}
		~Array(){
		}//这个类没有用到堆区内存,析构函数什么都不做
		//在函数中可以判断数组下标ii的合法性
		T& operator[](int ii){return items[ii];}//重载操作符[],形参是数组下标,可以修改数组中的元素
		const T& operator[](int ii)const{return items[ii];}//重载操作符[],形参是数组下标,不可以修改数组中的元素		
};
int main()
{
	Array<string,5>aa;//创建模板类Array的对象,需要指定非通用类型参数的值,因为有缺省值也可以不写
	//aa[0]=5;aa[1]=8;aa[2]=3;aa[3]=2;aa[4]=7;
	aa[0]="张三";aa[1]="李四";aa[2]="王五";aa[3]="老六";aa[4]="小七";
	for(int ii=0;ii<5;ii++)cout<<"a["<<ii<<"]="<<aa[ii]<<endl;
	return 0;
}

调试步骤

①去掉宏定义,使用非通用参数类型类模板

template <class T,int len=10>//可以有缺省值

②创建类对象时指定非通用参数类型模板

Array<string,5>aa;//也可以不指定,因为有缺省值

运行结果

 注意细节

1)通常时整型(C++20标准后可以);

2)实例化模板时必须用常量表达式;

3)模板中不能修改参数的值;

优点

在栈上分配内存,容易维护,执行速度快,适合小数组

缺点

在程序中,不同的非通用类型参数将导致编译器生成不同的类

二、可变数组:vector容器

代码

#include<iostream>
#include<string.h>
using namespace std;

template <class T>
class Vector
{
	private:
		int len;	//数组大小用成员变量表示
		T *items;	//数组元素用指针,动态分配
	public:
		Vector(int size=10):len(size){    //构造函数,把数组大小传入,分配内存
		    items=new T[len];
		}
		~Vector(){                        //析构函数
		    delete[]items;items=NULL;        //释放数组空间,指针置为空
		}
		void resize(int size){            //扩展数组的内存空间
			if(size<=len)return;            //只能往更大的扩展
			T*tmp=new T[size];                //分配更大的目标数组
			for(int ii=0;ii<len;ii++)        //将原来的数组赋给目标数组
				tmp[ii]=items[ii];
			delete[]items;                //释放原来的数组
			items=tmp;                    //让数组指向新的目标数组
			len=size;
		}
		int size()const{                //获取数组长度
            return len;
		}
		T& operator[](int ii){            //重载操作符[],形参是数组下标,可以修改数组中的元素
		    if(ii>=len)resize(ii+10);            //扩展数组空间
		    return items[ii];
		}
		const T& operator[](int ii)const{
            return items[ii];    //重载操作符[],形参是数组下标,不可以修改数组中的元素	
        }	
};

int main()
{
	//Array<string,10>aa;//创建模板类Array的对象,需要指定非通用类型参数的值
	//aa[0]=5;aa[1]=8;aa[2]=3;aa[3]=2;aa[4]=7;
	Vector<string>aa(1);
	aa[0]="张三";aa[1]="李四";aa[2]="王五";aa[3]="老六";aa[4]="小七";
	for(int ii=0;ii<5;ii++)cout<<"a["<<ii<<"]="<<aa[ii]<<endl;
	return 0;
}

调试步骤

①变长类数组模板类不需要非通用类型参数,数组大小用成员变量表示,数组动态分配

        int len;    //数组大小用成员变量表示
        T *items;    //数组元素用指针,动态分

 ②构造函数从主函数接收一个整型数据,用于初始化数组,动态分配数组空间Vector,并修改len

Vector(int size=10):len(size){    //构造函数,把数组大小传入,分配内存
     items=new T[len];
}

 ③增加一个扩展数组大小的函数

void resize(int size){            //扩展数组的内存空间
        if(size<=len)return;            //只能往更大的扩展
        T*tmp=new T[size];                //分配更大的目标数组
        for(int ii=0;ii<len;ii++)        //将原来的数组赋给目标数组
        tmp[ii]=items[ii];
        delete[]items;                //释放原来的数组
         items=tmp;                    //让数组指向新的目标数组
         len=size;
 }

④重载[ ]访问数组函数,增加扩展数组空间功能

        T& operator[](int ii){            //重载操作符[],形参是数组下标,可以修改数组中的元素
                if(ii>=len)resize(ii+10);            //扩展数组空间
                return items[ii];
        }

 运行结果

优点

虽然Vector容器效率不如Array容器,但是更通用,还可以自动扩展大小,也不会存在Array容器创建多个类的定义的情况;

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在这个问题中,用户提供了两段代码,分别是引用\[1\]和引用\[2\]。这两段代码都是用来在一个数组中查找指定数的位置。 引用\[1\]是一个C++代码示例,它使用了iostream和stdio.h头文件,并使用了命名空间std。代码中使用了一个while循环来不断读取输入的n值,然后创建一个大小为n的整型数组a,并通过for循环读取数组的元素。接下来,代码读取了一个整数m,并使用for循环遍历数组a,查找是否有与m相等的元素。如果找到了相等的元素,则将其位置赋值给变量t,并跳出循环。最后,根据t的值输出结果。 引用\[2\]是另一个C代码示例,它使用了stdio.h头文件。代码中同样使用了一个while循环来不断读取输入的n值,然后创建一个大小为n的整型数组a,并通过for循环读取数组的元素。接下来,代码读取了一个整数m,并使用for循环遍历数组a,查找是否有与m相等的元素。如果找到了相等的元素,则将其位置赋值给变量count,并将flag设置为1,表示找到了。最后,根据flag的值输出结果。 综上所述,这两段代码都是用来在一个数组中查找指定数的位置。它们的实现方式略有不同,但都能达到相同的目的。 #### 引用[.reference_title] - *1* [1143: 零起点学算法50——数组中查找数](https://blog.csdn.net/weixin_43965597/article/details/113104995)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [问题 C: 零起点学算法82——数组中查找数](https://blog.csdn.net/chenhannan0024/article/details/127568844)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值