c++ 群体数据 动态数组

直接访问群体--数组

动态数组类模板--Array

头文件

#ifndef ARRAY_H
#define ARRAY_H
#include<cassert>
template <class T>//数组类模板定义
class Array
{
private:
T* list;//用于存放动态分配的数组内存首地址
int size;//数组大小
public:
Array(int sz=50);//构造函数
Array(const Array<T> &a);//复制构造函数
~Array();//析构函数
int getSize()const;//取数组大小
void resize(int sz);//修改数组大小
Array<T> &operator=(const Array<T>&rhs);//重载"="
T &operator[](int i);//重载"[]"
const T&operator[](int i)const;//重载"[]"常函数
operator T*();//重载到T*类型的转换
operator const T*()const;

};
//构造函数实现
template<class T>Array<T>::Array(int sz)
{
assert(sz>=0);//sz数组大小
size=sz;
list=new T[size];//动态分配size个T类型的元素空间
cout<<"默认构造"<<endl;
}
//析构函数
template <class T> Array<T>::~Array()
{
delete[] list;
cout<<"析构函数"<<endl;
}
//复制构造函数
template <class T>
Array<T>::Array(const Array<T>&a)
{
size=a.size;
list=new T[size];
for(int i=0;i<size;i++)//从对象x复制数组元素到本对象
list[i]=a.list[i];
cout<<"复制构造"<<endl;
}
template <class T>
int Array<T>::getSize()const
{
return size;
}
template <class T>
void Array<T>::resize(int sz)
{
assert(sz>0);//检查sz是否为负
if(sz==size)//数组大小一样 则退出
{
return;
}
T* newList=new T[sz];//申请新的数组内存
int n=(sz<size)?sz:size;
for(int i=0;i<n;i++)
{
newList[i]=list[i];
}
delete[] list;
list=newList;
size=sz;
}
//重载"="运算符,将对象rhs复制给本对象。实现对象之间整体复制
template<class T>
Array<T> &Array<T>::operator=(const Array<T>&rhs)
{
//如果本对象数组大小与rhs不同,则删除数组原有内存,然后重新分配
if(&rhs!=this)
{
delete []list;//删除数组原有内存
size=rhs.size;//设置本对象的数组大小
list=new T[size];//重新分配size个元素内存
}
//从对象x复制数组元素到本对象
for(int i=0;i<size;i++)
{
list[i]=rhs.list[i];
}
return *this;//返回当前对象引用
}
//重载下标运算符,与普通数组一样通过下标访问元素,具有越界检查功能
template<class T>
T &Array<T>::operator[](int n)
{
assert(n>=0&&n<size);//检查下标是否越界
return list[n];//返回下标为n的数组元素
}
template<class T>
const T &Array<T>::operator[](int n)const
{
assert(n>=0&&n<size);//检查下标是否越界
return list[n];//返回下标为n的数组元素
}
//重载指针转换运算符,将Array类的对象名转换为T类型的指针
template <class T>
Array<T>::operator T*()
{
return list;//返回当前对象中私有数组的首地址
}
#endif //array.h

main.h

#include "stdafx.h"
//int _tmain(int argc, _TCHAR* argv[])
#include <iostream>
#include <iomanip>
#include "Array.h"
using namespace std;
//求2~N的质数
int main()
{
Array<int> a(10);
Array<int> b(10);
Array<int>c(a);
int n,count=0;
cout<<"Enter a value >=2as upper limit for prime number:";
cin>>n;
for(int i=2;i<=n;i++)
{//检查i是否能被比他小的质数整除
bool isPrime=true;
for(int j=0;j<count;j++)
{
if(i%a[j]==0)
{
isPrime=false;
break;
}
}
if(isPrime)
{
if(count==a.getSize())
a.resize(count*2);
a[count++]=i;
}
}
for(int i=0;i<count;i++)
cout<<setw(8)<<a[i];
cout<<endl;
cout<<"==============="<<endl;
for(int i=0;i<count;i++)
cout<<setw(8)<<*(a+i);
cout<<endl;
cout<<"==============="<<endl;
for(int i=0;i<count;i++)
cout<<setw(8)<<a.getSize();
cout<<endl;
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值