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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章