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

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博客 ” ,链接:http://blog.itpub.net/409557/viewspace-893681/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/409557/viewspace-893681/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值