第五十七讲 迭代器(2)

为了解决上一讲我们的问题,我们现在先来看看怎么写一个My_Array出来。在C++编程里面,最基本的思想就是用类来表示概念,所以,当他们决定用一个My_Array的时候,我们首先考虑到的是构造函数,当然,为了能够像前面这样使用:
—————————
My_Array m_Array[10];


—————————
我们必须保留默认构造函数,现在我们先不考虑复制构造和赋值操作,所以我们可以可以先这样写:
—————————-
template<typename T>
class My_Array{
public:

My_Array();



My_Array(int n);

//这个构造函数为了方便我们构造出int a[10](My_Array a(10))

~My_Array();


private:

T *m_Data;



unsigned
int m_Size;



My_Array(const My_Array&

);



My_Array&

operator=(const My_Array&

);


};


——————————

现在我们可以安全的写出下面代码:
——————————
My_Array<int>*m_Array = new My_Array<int>(10);


——————————

这句代码的意思不难理解,其实就是相当于:
——————————–
int *m_Array = new int[10];


——————————–
和下面的比起,我们上面的书写似乎有些太过麻烦了些,不过,我们上面的又有些不同,我们使用的面向对象的概念,而下面的书写方式却是一般的面向过程的思想,那么我们绕这么大个弯子就是想要体现出一个面向对象的概念,这值得吗?为了说明这个问题,我们来看看下面这段代码:
——————————-
My_Array<int>*m_Array = new My_Array<int>(10);


for(int i=0;

i<10;

i++)
m_Array->insert(i,i);

for(int i=0;

i<10;

i++)
cout<<(*m_Array)[i]<<"

"

;


——————————
嗯,这看上去没啥了不起的,直接使用int一样能做到,而且我们想要让上面的代码顺利运行,我们还得添加两个方法:
——————————
template<typename T>
class My_Array{
public:

My_Array();



My_Array(int n);



~My_Array();



T&

operator[](int n);

//为了使用(*m_Array)[i]

const T&

operator[](int n) const;

//上面的const版本

void insert(const T&

t,int n);

//使用insert(i,i)
private:

T *m_Data;



unsigned
int m_Size;



My_Array(const My_Array&

);



My_Array&

operator=(const My_Array&

);


};


———————————

当然,我们可以再添加一个操作,用来重新分配内存块的,如果我们将这个函数命名为resize,那么我们可以这样实现这个方法:
———————————-

void My_Array<T>::resize(int n){

if(n==m_Size)

return;



T*
temp = m_Data;



m_Data = new T[n];



copy(temp,n>m_Size?m_Size:n);



delete temp;



m_Size = n;


}
————————————

当然,我们要完成这个方法,我们还要完成一个辅助函数copy,对于copy他的目的只是为了帮助转移数据,所以我们可以这么来实现:
————————————-

void My_Array::copy(T *array,int n){

for(int i=0;

i<n;

i++)

m_Data[i] = array[i];


}
————————————–

有了这两个方法之后,于是乎,我们就可以这么写:
————————————
My_Array<int>*m_Array = new My_Array<int>(10);


for(int i=0;

i<10;

i++)
m_Array->insert(i,i);


for(int i=0;

i<10;

i++)
cout<<(*m_Array)[i]<<"

"

;


m_Array->resize(20);


for(int i=10;

i<20;

i++)
m_Array->insert(i,i);


for(int i=0;

i<20;

i++)
cout<<(*m_Array)[i]<<"

"

;


———————————–

这是内置数组无法完成的操作,当然,如果我们非要绕个弯子来完成也是可以的,但是试想一下,我们这样可以这样一劳永逸为什么还要一遍遍的尝试呢?

嗯,今天就这样吧,说得太多了,可能有些朋友看一遍无法消化,所以我们分开写细说,那么大家现在思考以问题,当然我们目前的任务是先完成这个My_Array,所以要让大家思考的问题当然离不开我们的My_Array,我们想要如下使用这个类:
——————————
My_Array<int>m_Array;


for(int i=0;

i<N;

i++)

m_Array.push_back(i);


for(int i=0;

i<N;

i++)

cout<<m_Array[i]<<"

"

;


——————————

我们要让这段代码输出如下的结果:
——————————-
0 1 2 3 4 5 6 7 8 9…………N
——————————-

==================
回复D直接查看目录


原文始发于微信公众号(

C/C++的编程教室

):第五十七讲 迭代器(2)

|

发表评论