C++用模板类实现数组功能

        在C++中提供了模板功能,利用模板类可实现不同数据类型的数组功能。具体如下:

#ifndef _ARR_H_
#define _ARR_H_

#include <iostream>
#include <string.h>
#define SIZE 1024

using namespace std;

template <typename T>
class arry
{
	private:
		T arr[SIZE];
		int size;
		int len;
	public:
		arry();
		arry(const T *addr,int len);
		T &operator[](int n);
		void insert(T val,int pos); //插入操作
		void show();
		void del(int pos);
};

#endif

        首先在头文件中对数组类进行声明定义,我们定义的数组属性包括数组内容数组最大大小以及实际数据长度。以上成员变量设置为私有变量防止被后续使用的时候被改变,接着设置公共成员函数包括构造函数(无参、带参)运算符“[]”重载插入显示(这里应该也可以输出运算符重载的,暂不实现)以及删除

#include "arr.h"

template <typename T>
arry<T>::arry()
{
	memset(arr,0,sizeof(arr));
	size = SIZE;
	len  = 0;
}

template <typename T>
arry<T>::arry(const T *addr,int len)
{
	for(int i=0;i<len;i++)
	{
		arr[i] = addr[i];
	}
	size = SIZE;
	this->len = len;
}

template <typename T>
T &arry<T>::operator[](int n)
{
	if(n>len||n<0)
	{
		cout << "内存超出!" << endl;
		return this->arr[0];
	}
	return this->arr[n];
}

template <typename T>
void arry<T>::show()
{
	int length =this->len;
	for(int i=0;i<length;i++)
	{
		cout << this->arr[i] << " ";
	}
	cout << endl;
}

template <typename T>
void arry<T>::insert(T val,int pos)
{
	if(pos<0||pos>this->len)
	{
		cout << "插入位置错误!0~" << this->len << endl;
		return;
	}
	int lenght = this->len;
	for(int i=lenght;i>pos;i--)
	{
		this->arr[i] = this->arr[i-1];
	}
	this->arr[pos] = val;
	this->len++;
}

template <typename T>
void arry<T>::del(int pos)
{
	if(pos<0||pos>this->len)
	{
		cout << "插入位置错误!0~" << this->len << endl;
		return;
	}
	int length = this->len;
	for(int i=pos;i<length;i++)
	{
		this->arr[i] = this->arr[i+1];
	}
	this->len--;
}

        接着便是实现上述成员函数,代码如上。需要注意的是每个函数都需要添加模板类以及作用域声明。在无参构造函数中,需要使用memset函数将arr[SIZE]全都初始化为0,数组长度初始化为0。在插入函数中,每插入一个数据长度就加1,相反的,删除操作就需要减1。

最后来测试一下:

#include "arr.cpp"

int main(void)
{
	int a[]={1,2,3,45,6};
	arry<int> buf(a,5);
	buf.show();
	buf[0] = 100;
	buf.show();
	buf.insert(2000,3);
	buf.show();
	buf.del(3);
	buf.show();
	
	arry<char> buf2("hello wrold!",13);
	buf2.show();
	buf2[0] = 'X';
	buf2.show();
	buf2.insert('O',5);
	buf2.show();
	buf2.del(5);
	buf2.show();
	return 0;
}

打印信息如下:

1 2 3 45 6 
100 2 3 45 6 
100 2 3 2000 45 6 
100 2 3 45 6 
h e l l o   w r o l d !  
X e l l o   w r o l d !  
X e l l o O   w r o l d !  
X e l l o   w r o l d !  

可以看见我们测试的int和char类型都实现了插入删除等操作。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值