重载运算符
[][]
在一维数组的基础上重新设计二维数组类
利用C++的template参数的嵌套性
Array<
Array <double> > a(3)
1.重新加入了个rsize,判断二维数组是否超。
1.重新加入了个rsize,判断二维数组是否超。
#include <iostream>
using namespace std;
template <class T>
class Array
{
private:
T *arr;
int arrsize;
public:
Array(int asize=100):arrsize(asize){arr=new T[asize];}
~Array(){delete []arr;}
T& operator[](int ind);
operator T*() {return arr;}
void resize(int rsize);
};
template <class T>
T& Array<T>::operator[](int ind)
{
static T t;
if (ind<arrsize&&ind>=0)
return arr[ind];
else
{
cout<<"下标出界:("<<ind<<")";
return t;
}
}
template <class T>
void Array<T>::resize(int rsize){
if (rsize<0||rsize==arrsize)
return ;
T *newarr=new T[rsize];
int n=(rsize<arrsize)?rsize:arrsize;
for(int i=0;i<n;i++)
newarr[i]=arr[i]; //保存原数组值
delete []arr;
arr = newarr;
arrsize = rsize;
}
int main()
{
Array<Array <double> > a(3);
int i,j;
a[0].resize(2);
a[1].resize(2);
a[2].resize(2);
for(i=0;i<3;i++)
for(j=0;j<2;j++)
a[i][j] = 10*i+j;
cout<<a[1][1]<<endl;
cout<<a[1][3]<<endl;
cout<<a[3][1]<<endl;
return 0;
}
2.使用<vector>
a.at(1).at(3)
<vector>中.at()可以检查是否越界
<pre name="code" class="cpp">vector<vector <double> > a(3);
需要加入这句话,可以检查二维a.at().at().
#include <iostream>
#include <vector>
using namespace std;
template <class T>
class Array
{
private:
T *arr;
int arrsize;
public:
Array(int asize=100):arrsize(asize)
{
arr=new T[asize];
}
~Array()
{
delete []arr;
}
T& operator[](int ind);
operator T*()
{
return arr;
}
void resize(int rsize);
};
template <class T>
T& Array<T>::operator[](int ind)
{
static T t;
if (ind<arrsize&&ind>=0)
return arr[ind];
else
{
cout<<"下标出界:("<<ind<<")";
return t;
}
}
template <class T>
void Array<T>::resize(int rsize)
{
if (rsize<0||rsize==arrsize)
return ;
T *newarr=new T[rsize];
int n=(rsize<arrsize)?rsize:arrsize;
for(int i=0; i<n; i++)
newarr[i]=arr[i]; //保存原数组值
delete []arr;
arr = newarr;
arrsize = rsize;
}
int main()
{
// Array<Array <double> > a(3);
vector<vector <double> > a(3);
int i,j;
a[0].resize(2);
a[1].resize(2);
a[2].resize(2);
for(i=0; i<3; i++)
for(j=0; j<2; j++)
a[i][j] = 10*i+j;
cout<<a[1][1]<<endl;
cout<<a[1][3]<<endl;
cout<<a[3][1]<<endl; //出现终止程序
// a[3][1]=1;
cout<<a.at(1).at(3)<<endl; //越界检查 , a[1][3] 不同
return 0;
}
3.重新设计二维数组。
#include <iostream>
using namespace std;
template <class T>
class Array
{
private:
T *arr;
int arrsize;
public:
Array(int asize=100):arrsize(asize){arr=new T[asize];}
~Array(){delete []arr;}
T& operator[](int ind);
operator T*() {return arr;}
void resize(int rsize);
};
template <class T>
T& Array<T>::operator[](int ind)
{
static T t;
if (ind<arrsize&&ind>=0)
return arr[ind];
else
{
cout<<"下标出界:("<<ind<<")";
return t;
}
}
template <class T>
void Array<T>::resize(int rsize){
if (rsize<0||rsize==arrsize)
return ;
T *newarr=new T[rsize];
int n=(rsize<arrsize)?rsize:arrsize;
for(int i=0;i<n;i++)
newarr[i]=arr[i]; //保存原数组值
delete []arr;
arr = newarr;
arrsize = rsize;
}
template <class T>
class Array2
{
private:
Array<T> *arr;
int arrrow,arrcol;
public:
Array2(int =100,int =100);
~Array2(){delete []arr; };
Array<T>& operator[](int ind);
operator Array<T>*() {return arr;}
};
template <class T>
Array2<T>::Array2(int row,int col):arrrow(row),arrcol(col)
{
arr=new Array<T>[row];
for(int i = 0; i < row; i++)
arr[i].resize(col);
};
template <class T>
Array<T>& Array2<T>::operator[](int ind){
static Array<T> t;
if (ind<arrrow&&ind>=0)
return arr[ind];
else
{
cout<<"下标2出界:("<<ind<<")";
return t;
}
}
int main()
{
Array2<double> a(3,2);
int i,j;
for(i=0;i<3;i++)
for(j=0;j<2;j++)
a[i][j] = 10*i+j;
// cout<<(*(a+1))[1]<<endl;
// cout<<*(a[1]+0)<<endl;
// cout<<*(*(a+0)+1)<<endl;
cout<<a[1][1]<<endl;
cout<<a[1][3]<<endl;
cout<<a[3][1]<<endl;
return 0;
}
不能重载【】【】。