ITPub博客

首页 > 应用开发 > IT综合 > 读书笔记: 第十三章访问容器中的元素3

读书笔记: 第十三章访问容器中的元素3

原创 IT综合 作者:karlyang88 时间:2007-01-25 22:45:25 0 删除 编辑
C++沉思录第十三章读书笔记3[@more@]

13-4 指向const Array 的Pointer

还有一点障碍:我们不能使 Pointer指向const Array 的元素。

template class Ptr_to_const {

public:

// const Array&, 而不是Array&

Ptr_to_const(const Array& a, unsigned n = 0):

ap(a.data), sub(n) { ++ap->use; }

Ptr_to_const():ap(0), sub(0) {}

Ptr_to_const(const Ptr_to_const& p):

ap(p.ap), sub(p.sub)

{

if(ap)

++ap->use;

}

~Ptr_to_const() {

if(ap &&--ap->use ==0)

delete ap;

}

Ptr_to_const& operator =(const Ptr_to_const& p) {

if(p.ap)

++p.ap->use;

if(ap && --ap->use == 0)

delete ap;

ap = p.ap;

sub = p.sub;

return *this;

}

// const T& , 而不是T&

const T& operator*() const {

if(ap == 0)

thorw "* of unbound Ptr_to_const";

return (*ap)[sub];

}

private:

Array_data* ap;

unsigned sub;

};

13-5 有用的增强操作

resize 和reserve操作。

template class Array {

public:

void resize(unsigned n) {

data->resize();

}

//...

};

template

void Array_data::resize(unsigned n)

{

if(n == sz) return;

T* odata = data;

data = new T[n];

copy(odata, sz >n?n:sz); //没有想明白?

delete [] odata;

sz = n;

}

template

void Array_data::copy(T* arr, unsigned n)

{

for (int i = 0; i < n; i++)

data[i] = arr[i];

}

Array a;

//...

while( /*某个条件*/ )

{

a.reserve(n+1);

a[n] = //某个值

}

//用户很可能写这样的代码

a.reserve(n);

a[n] = //某个值

template class Array {

public:

void reserve(unsigned new_sz) {

if(new_sz >= data->sz)

data->grow(new_sz);

}

//....

};

template

void Array_data::grow(unsigned now_gz)

{

unsigned nsz = sz;

if(nsz == 0)

nsz = 1;

while(nsz <= new_sz)

nsz *= 2;

resize(nsz);

}

要想能够有效的重新设置Array的大小,需要还能对它进行复制和赋值。

template class Array {

public:

Array(const Array& a):

data(new Array_data(a.data->sz)

{

data->copy(a.data->data, a.data->sz);

}

Array& operator=(const Array&); ///???

//...

};

我们不希望允许对Array_data对象赋值。将不能正确地管理引用计数。我们将在Array_data中定义一个clone操作来重新分配data数组和进行复制操作。要记住检查自我复制。(?)

template class Array{

public:

Array& operator=(const Array& a) {

if(this != &a)

data->colone(*a.data, a.data->data);

return *this;

}

//...

};

template

void Array_data::clone(const Array_data& a, unsigned n)

{

delete [] data;

data = new T[sz= a.sz];

copy(a.data, sz);

}

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/409557/viewspace-893681/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 几首豪放词
请登录后发表评论 登录
全部评论
  • 博文量
    35
  • 访问量
    336363