复习(数据结构):动态数组: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
- 复习(数据结构):动态数组:c++_常规写法
- 复习(数据结构):动态数组:c++_stl写法
- 复习(数据结构):线性表 : c++_标准写法
- 复习(数据结构):栈:c语言:动态数组
- 复习(数据结构):动态数组:c_语言数组
- 复习(数据结构:java):线性表(数组):接口的写法
- 复习(数据结构):栈:c语言:数组
- 数据结构_复习1
- 数据结构_复习2
- 数据结构_动态数组形式的顺序表相关操作C语言源代码
- 数据结构(C#)_查找(动态查找)
- 复习(数据结构:java):线性表(数组):泛型的写法
- 数据结构(c语言)之动态数组
- 复习C语言系列二:动态调用函数指针数组
- C++总复习_数组
- 数据结构_动态规划
- 数据结构复习--数组的移动
- 数据结构复习--数组的移动
- Python解析json
- 用WindowBuilder编写SWT 桌面应用程序
- Android视频播放
- hdoj1074【A的无比爆炸】
- python学习——filter
- 复习(数据结构):动态数组:c++_常规写法
- (总结)Nginx/LVS/HAProxy负载均衡软件的优缺点详解
- Vs2013集成EF和SQLite的步骤(一)
- 理解Fragment生命周期
- 周志华《机器学习》笔记:第1章 绪论
- CSS定位中的必须深究的常用技法
- uva12657 移动盒子
- 【Linux全面学习】1.Linux入门介绍
- Memcached Java Client API详解