C++模板实现智能数组类

原创 2012年03月27日 22:39:21

这个类的使用非常有限,不能说是真正的智能数组

对于一般的数据类型还可以,比如int /float/char等

但是,string类这样的类类型好像不是很好

但是一些基础的东西却是学习的重点

头文件MyArray.h:

#pragma once
#include <iostream>
using namespace std;
template<class T,int N=5>//定义一个类似数组的模板类(智能数组)
class CMyArray
{
public:
	CMyArray(const T& v);
	~CMyArray(void);
	void Show()const;
	int GetLength()const;//获取对象当前元素数目
	int GetTotalSize()const;//获取对象当前申请的总内存
	void ShowSize()const;//显示当前对象的元素个数和总内存数
	T RemoveAt(const int& index);//删除指定位置的元素(索引从0开始),返回删除的元素
	bool RemoveAll();//删除所有元素
	bool IsEmpty()const;//判断当前容器是否为空
	T& operator [](int i);
	void Pop(const T& t);//尾部加入一个元素
	T Push();//尾部删除一个元素,返回该元素
	friend ostream& operator<<(ostream& os,const CMyArray& a)
	{
		a.Show();
		return os;
	}
private:
	T* temp;
	int m_nTotalSize;//当前的总内存数目
	int m_nValideSize;//当前的实际元素个数
};
template<class T,int N>
CMyArray<T,N>::CMyArray(const T& v):temp(NULL)
{
	temp=new T[N];
	m_nTotalSize=m_nValideSize=N;
	for(int i=0;i<N;i++)
		temp[i]=v;
}
template<class T,int N>
CMyArray<T,N>::~CMyArray(void)
{
	if(temp!=NULL)
	{

		delete[] temp;
		temp=NULL;
	}
}
template<class T,int N>
void CMyArray<T,N>::Show()const
{
	if(m_nValideSize==0)
	{
		cout<<"当前对象为空,无法输出"<<endl;
		return;
	}
	cout<<"依次输出当前"<<m_nValideSize<<"个元素"<<endl;
	for(int i=0;i<m_nValideSize;i++)
    	cout<<temp[i]<<"   ";
	cout<<endl;
}
template<class T,int N>
T& CMyArray<T,N>::operator [](int i)
{
	if(i<0||i>N-1)
	{
		cout<<"数组越界,返回第一个元素"<<endl;
		i=0;
	}
	return temp[i];
}
template<class T,int N>
int CMyArray<T,N>::GetLength()const
{
	return m_nValideSize;

}
template<class T,int N>
void CMyArray<T,N>::Pop(const T& t)
{
	if(m_nValideSize<m_nTotalSize)//还有空闲内存
	{
		temp[m_nValideSize]=t;
		m_nValideSize++;
	}
	else//内存用完,继续申请
	{
		//先保存当前数据到临时指针中
		T* data=new T[m_nTotalSize];
		for(int i=0;i<m_nTotalSize;i++)
		{
			data[i]=temp[i];
		}
		delete[] temp;//释放内存
		temp=NULL;//避免产生野指针
		m_nTotalSize*=2;//扩容一倍
		temp=new T[m_nTotalSize];
		for(int i=0;i<m_nValideSize;i++)
		{
			temp[i]=data[i];//复制数据到原始指针中
		}
		delete[] data;//释放内存
		data=NULL;
		temp[m_nValideSize]=t;
		m_nValideSize++;

	}
}
template<class T,int N>
int CMyArray<T,N>::GetTotalSize()const
{
	return m_nTotalSize;
}
template<class T,int N>
T CMyArray<T,N>::Push()
{
	T t;
	if(m_nValideSize==0)
	{
		cout<<"容器已空!"<<endl;
		t=(T)NULL;
		return t;
	}
	t=temp[m_nValideSize];
	m_nValideSize--;
	if((m_nValideSize%N)==0)//刚好多出一个元素,为了节省内存,释放掉一个N的内存
	{
		T* data=new T[m_nValideSize];
		for(int i=0;i<m_nValideSize;i++)
			data[i]=temp[i];
		delete[] temp;//释放内存
		temp=NULL;
		temp=new T[m_nValideSize];//申请内存
		m_nTotalSize=m_nValideSize;
		for(int i=0;i<m_nValideSize;i++)
			temp[i]=data[i];
		delete[] data;
		data=NULL;
	}
	return t;
}
template<class T,int N>
void CMyArray<T,N>::ShowSize()const
{

	cout<<"当前对象中元素数目为:"<<m_nValideSize<<endl;
	cout<<"总内存为:"<<m_nTotalSize<<endl;
}
template<class T,int N>
T CMyArray<T,N>::RemoveAt(const int& index)
{
	if(m_nValideSize==0)
	{
		cout<<"容器已经为空"<<endl;
		return (T)NULL;
	}
	if(index<0||index>m_nValideSize-1)//数组越界
	{
		cout<<"数组越界,无法完成删除操作"<<endl;
		return (T)NULL;
	}
	T ret=temp[index];
	m_nValideSize--;
	T* data=new T[m_nValideSize];
	for(int i=0;i<index;i++)
		data[i]=temp[i];
	for(int i=index;i<m_nValideSize;i++)
		data[i]=temp[i+1];
	delete[] temp;
	temp=NULL;
	temp=new T[m_nValideSize];
	for(int i=0;i<m_nValideSize;i++)
		temp[i]=data[i];
	delete[] data;
	data=NULL;
	return ret;

}
template<class T,int N>
bool CMyArray<T,N>::RemoveAll()
{
	if(m_nValideSize==0)
	{
		cout<<"容器已经为空"<<endl;
		return flase;
	}
	delete[] temp;
	temp=NULL;
	m_nValideSize=m_nTotalSize=0;
	return true;
}
template<class T,int N>
bool CMyArray<T,N>::IsEmpty()const
{
	if(m_nValideSize==0)
		return true;
	return false;
}

主函数测试功能:

// C++模板类.cpp : 定义控制台应用程序的入口点。
//

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

int _tmain(int argc, _TCHAR* argv[])
{
/*	CMyArray<int,7> a(3);
	a.Show();
	a.Pop(5);
	a.Show();
	int len=a.GetLength();
	int size=a.GetTotalSize();
	cout<<len<<endl<<size<<endl;*/
/*	CMyArray<int,7> a(5);
	a.Show();
	a.Pop(6);
	a.ShowSize();
	a.Push();
	a.ShowSize();*/
/*	CMyArray<int,1> a(0);
	a.Show();
	a.Push();
	a.Show();
	CMyArray<float,1> str(0.001);
	str.Show();
	str.Push();
	str.Show();*/
	CMyArray<int> a(0);
	a[0]=5;
	a[1]=3;
	a.Show();
	a.RemoveAt(0);
	a.Show();
	a.IsEmpty();
	cout<<a<<endl;
	CMyArray<char> c('a');
	c.Show();
	return 0;
} 

指针是C++中的一把双刃剑,用得好可以事半功倍

同样,稍不注意就会造成内存泄露,产生野指针。

使用指针特别要注意:

有new 则有delete

new【】则对应则delete[]

版权声明:本文为博主原创文章,未经博主允许不得转载。(博客地址:http://blog.csdn.net/mfcing)

【C++】数组类的定义(类模板)

一、为什么要引进类模板 减少代码重用。 这个概念在C++里有很多 二、类模板与模板类 (1)类模板的含义 类模板的意思是,按不同的方式重复使用相同的代码。 一个类模板(也称为类属类或类生成...

C++模板参数为数组

本想写个模板函数,然后导成DLL,然后可以到处引用。可是后来发现,我的想法很天真。 由于C++是强类型语言,所以模板在用的时候必须确定其类型。而C++的模板只是一种语法糖,只不过是编译器在后台在做字...

C++实践参考:数组类模板

【项目-数组类模板】   在数组类的基础上,将之改造为类模板,以使数组中可以存储各种类型的数据。template //数组类模板定义 class Array { private: T* ...

数组类模板

 *Copyright (c) 2014,烟台大学计算机学院 *All right reserved. *文件名称:test.cpp *作    者:韩双志 *完成日期:...

用C++的模板类定义一个万能数组,数组元素类型任意,数组大小也任意

/*用模版类实现一个万能数组,数组类型可以任意给定,数组大小可以任意给定*/ /* 函数调用 typeid(变量).name() 获取变量的类型名 */ #include using n...

C++类模板 template <class T>

类模板与函数模板的定义和使用类似,我们已经进行了介绍,如果您对函数模板也感兴趣,请查看:。 有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类: class Com...

c++通用模板类(template class)定义实现详细介绍

有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类:class Compare_int { public : Compare(int a,int b) { x=a; y=...

C++ 高级篇(一)—— 模板(Templates)

模板(Templates)是ANSI-C++ 标准中新引入的概念。如果你使用的 C++ 编译器不符合这个标准,则你很可能不能使用模板。     函数模板( Function templates) ...

C++ - 类模板(class template) 详解 及 代码

类模板(class template) 详解 及 代码   本文地址: http://blog.csdn.net/caroline_wendy   类模板(class template)需要添加模板参...

c++模板类

c++模板类 分类: 数据结构2010-04-02 11:40 152人阅读 评论(0) 收藏 举报 理解编译器的编译模板过程 如何组织编写模板程序 前言 常遇到询问使用模板...
  • jfkidear
  • jfkidear
  • 2012年08月20日 21:28
  • 31677
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++模板实现智能数组类
举报原因:
原因补充:

(最多只允许输入30个字)