复习(数据结构):动态数组:c++_常规写法

来源:互联网 发布:无限极植雅牙膏知乎 编辑:程序博客网 时间:2024/05/18 03:08

1. 异常类

//内存异常//内存异常#include<new.h>class BadInitializers {   public:      BadInitializers() {}};// insufficient memoryclass NoMem {   public:      NoMem() {}};//new引发Nomen的异常,而不是xallocvoid my_new_handler(){    throw NoMem();}new handler Old_Handler =  set_new_handly(my_new_handler);//超出边界class OutOfBounds {   public:      OutOfBounds() {}};

类定义

template<class T>class Array1D{public:    Array1D(int size=0);    Array1D(const Array1D<T>& v); //复制构造函数    ~Array1D(){delete[] element;}    T& operator[](int i) const;    int Size(){return size;}    Array1D<T>& operator=(const Array1D<T>& v);//在原值上计算    Array1D<T> operator+() const;//返回值,返回副本    Array1D<T> operator+(const Array1D<T>& v) const; // 返回引用    Array1D<T> Array1D<T> operator-() const;    Array1D<T> operator-(const Array1D<T>& v) const;    Array1D<T> operator*(const Array1D<T>& v) const;    Array1D<T>& operator+=(const T& x) const;private:    int size;    T *element;    //指针数组:每个元素都是T型的指针    //T[i]=&anArray[i]};

核心函数的实现

  • 构造函数
template <class T>Array1D<T>::Array1D(int sz){    if(sz<0) throw BadInitializers();    size=sz;    element=new T[sz];}//默认拷贝函数是浅拷贝//当类声明有new(在堆上的时候就会产生问题)//需要自己去定义深拷贝函数template<class T>Array1D<T>::Array1D(const Array1D<T>& v){    size=v.size;    element=new T[size];//申请空间    for(int i=0;i<size;i++) //复制元素        element[i]=v.element[i];}
  • 重载操作符
// 操作符[]的重载template<class T>T& Array1D<T>::operator[](int i) const{   // 返回指向第i个元素的引用    if(i<0||i>=size) throw OutOfBounds();    return element[i];}//操作符=//首先释放目标函数*this的内存空间//然后分配可以容纳v的空间//同时,避免了自我赋值template<class T>Array1D<T>& Array1D<T>::operator =(const Array1D<T>& v){    if(this!=&v){ //没有自我赋值        size=v.size;        delete[] element;// 释放原来的空间        element=new T[size]; //申请新的空间        for(int i=0;i<size;i++)            element[i]=v.element[i];    }    return *this;}template<class T>Array1D<T> Array1D<T>::           operator+(const Array1D<T>& v) const{// Return w = (*this) + v.   if (size != v.size) throw SizeMismatch();   // create result array w   Array1D<T> w(size);   for (int i = 0; i < size; i++)       w.element[i] = element[i] + v.element[i];   return w;}template<class T>Array1D<T> Array1D<T>::           operator-(const Array1D<T>& v) const{// Return w = (*this) - v.   if (size != v.size) throw SizeMismatch();   // create result array w   Array1D<T> w(size);   for (int i = 0; i < size; i++)       w.element[i] = element[i] - v.element[i];   return w;}template<class T>Array1D<T> Array1D<T>::operator-() const{// Return w = -(*this).   // create result array w   Array1D<T> w(size);   for (int i = 0; i < size; i++)       w.element[i] = -element[i];   return w;}template<class T>Array1D<T> Array1D<T>::operator*(const Array1D<T>& v) const{// Return w = (*this) * v. Pairwise multiply.   if (size != v.size) throw SizeMismatch();   // create result array w   Array1D<T> w(size);   for (int i = 0; i < size; i++)       w.element[i] = element[i] * v.element[i];   return w;}template<class T>Array1D<T>& Array1D<T>::operator+=(const T& x){// Add x to each element of (*this).   for (int i = 0; i < size; i++)       element[i] += x;   return *this;   }template<class T>ostream& operator<<(ostream& out,                    const Array1D<T>& x){// Put the elements of x into the stream out.   for (int i = 0; i < x.size; i++)      out << x.element[i] << "  ";   return out;}template<class T>Array1D<T>& Array1D<T>::ReSize(int sz){// Change the size to sz. // Do not copy array elements to new space.   if (sz < 0) throw BadInitializers();   delete [] element;   size = sz;   element = new T [size];   return *this;}

  • 测试程序
#include <iostream.h>#include "array1d.h"void main(void){   try {      Array1D<int> X(10), Y, Z;      for (int i=0; i < 10; i++)         X[i] = i;      cout << "X[3] = " << X[3] << endl;      cout << "X is " << X << endl;      Y = X;      cout << "Y is " << Y << endl;      X += 2;      cout << "X incremented by 2 is " << X << endl;      Z = (Y + X) * Y;      cout << "(Y + X) * Y is " << Z << endl;      cout << "-(Y + X) * Y is " << -Z << endl;      }   catch (...) {      cerr << "An exception has occurred" << endl;}}
0 0
原创粉丝点击