Part9 模板与群体数据 9.3数组

静态数组是具有固定元素个数的群体,其中的元素可以通过下标直接访问。
动态数组由一系列位置连续的,任意数量相同类型的元素组成。
vector就是用类模板实现的动态数组。

 

//9-3动态数组类模板程序
#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();                    //析构函数
    Array<T> & operator = (const Array<T> &rhs);    //重载 = 
    T & operator [] (int i);                        //重载[]
    const T & operator[] (int i) const;                //重载[] 常函数
    operator T * ();            //重载到T*类型的转换
    operator const T * () const;
    int getSize() const;        //取数组的大小
    void resize(int sz);        //修改数组的大小
};

template<class T>         //构造函数
Array<T>::Array(int sz){
    assert(sz >= 0);
    size = sz;
    list = new T[size];        //动态分配size个T类型的元素空间
}

template<class T>        //析构函数
Array<T>::~Array(){
    delete [] list;
}

template<class T>        //复制构造函数,实现深层复制
Array<T>::Array(const Array<T> &a){
    size = a.size;
    list = new T[size];
    for(int i = 0; i < size; i++)
        list[i] = a.list[i];
}

template<class T>        //重载=运算符,将rhs赋值给本对象。实现对象之间的整体赋值
Array<T> &Array<T>::operator = (const Array<T>& rhs){
    if(&rhs != this){
        if(size != rhs.size){        //如果本对象中数组大小与rhs不同,则删除数组原有内存,然后重新分配
            delete[] list;
            size = rhs.size;
            list = new T[size];
        }
        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];
}
template<class T>
const T &Array<T>::operator[] (int n) const{
    assert(n >= 0 && n < size);
    return list[n];
}

template<class T>        //重载指针转换运算符,将Array类的对象名转换为T类型的指针
Array<T>::operator T*(){
    return list;        //返回当前对象中私有数组的首地址
}

template<class T>        //取当前数组的大小
int Array<T>::getSize() const{
    return size;
}

template<class T>        //将数组的大小修改为sz
void Array<T>::resize(int sz){
    assert(sz >= 0);
    if(sz == size)
        return ;
    T* newList = new T[sz];        //申请新的数组内存
    int n = (sz < size) ? sz : size;
    for(int i = 0; i < n; i++)        //将原有数组中前n个元素复制到新数组中
        newList[i] = list[i];
    delete[] list;        //删除原数组
    list = newList;        //使List指向新数组
    size = sz;            //更新size
}
#endif

 

//9-4Array类的应用:求范围2~N中的质数,N在程序运行时由键盘输入。
#include<iostream>
#include<iomanip>
#include "Array.h"
using namespace std;
int main(){
    Array<int> a(10);        //用来存放质数的数组,初始状态有10个值
    int n, count = 0;
    cout << "Enter a value >= 2 as upper limit for prime numbers: ";
    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;
    return 0;
}
//举例指针转换运算符的作用
#include<iostream>
using namespace std;
void read(int *p, int n){
    for(int i = 0; i < n; i++)
        cin >> p[i];
}
int main(){
    int a[10];
    read(a,10);
    return 0;
}

#include "Array.h"
#include<iostream>
using namespace std;
void read(int *p, int n){
    for(int i = 0; i < n; i++)
        cin >> p[i];
}
int main(){
    Array<int> a(10);
    read(a,10);
    return 0;
}

 

posted @ 2017-12-27 20:46  LeoSirius  阅读(173)  评论(0编辑  收藏  举报