if (isbn==0) break;
: B. \, |1 c1 b: m- U( U6 q if (n==size) // 数组是否到达上限?
& ~) `- N5 w6 \8 { reallocate(p, size);' F0 p" G+ Q+ S0 ]* z
p[n]=isbn; // 将元素插入扩容的数组
9 s( L7 l. m5 o5 g. S }
_$ j( A3 C& i$ @$ h, ] delete [] p; // 不要忘了这一步!9 s$ A# U* A/ l0 C: h4 p
}( Z* A' M, c" R: S* L, S# b
注意上述这个向数组插入数据的过程是多么的繁琐。每次反复,循环都要检查缓存是否达到上限。如果是,则程序调用用户定义的函数 reallocate(),该函数实现如下:" b* b' S0 X- \1 J0 m
#include // for std::copy3 D& a" Y! I+ ~; p( R4 ]
int reallocate(int* &p, int& size)
! y8 v7 W0 A8 ]* } {
# d- Y/ I& s5 \! J9 k8 U6 b2 t/ O size*=2; // double the array''s size with each reallocation
, j" e' O* N' ]4 r3 Q int * temp = new int[size];7 D6 q3 X. }" _/ a% `6 @% [
std::copy(p, p+(size/2), temp);# W) U ]1 l& |. i
delete [] p; // release original, smaller buffer
o N" I! U4 | p=temp; // reassign p to the newly allocated buffer
) A( n( H: i0 a7 p) ~: }7 ]( l/ M }
, u6 c" k! I8 Z v0 t reallocate() 使用 STL std::copy() 算法对缓存进行合理的扩充——每次扩充都放大一倍。这种方法可以避免预先分配过多的内存,从量上减少需要重新分配的内存。这个技术需要得到充分的测试和调试,当初学者实现时尤其如此。此外,reallocate() 并不通用,它只能处理整型数组的情形。对于其它数据类型,它无能为力,你必须定义该函数额外的版本或将它模板化。幸运的是,有一个更巧妙的办法来实现。
( Q+ `( c: k i) p( C9 R 创建和优化 vector
1 W0 S$ X \, O0 J 每一个 STL 容器都具备一个分配器(allocator),它是一个内建的内存管理器,能自动按需要重新分配容器的存储空间。因此,上面的程序可以得到大大简化,并摆脱 reallocator 函数。: c. a" ?, f3 W% S9 p
第一步:创建 vector' ]" `/ D+ K6 B3 ^4 w3 @1 p* N
用 vector 对象取代内建的数组来保存获取的数据。main() 中的循环读取 ISBN,检查它是否为 0,如果不为 0 ,则通过调用 push_back() 成员函数将值插入. G* ]8 k$ N; l4 B
vector: #include
/ F) e' S( f8 f #include
' o7 S3 n! f# C using namespace std;
' h! r) b' C, z8 J. T2 d int main()
$ p" r) V) }/ J0 z/ Q* m {
3 C( j6 g$ U: \; O vector vi;5 r6 |% V7 j, ^; _! N
int isbn;
1 F: v! \$ ]/ p% f6 { while(true)
1 ^* ^* }+ K2 s' L0 i+ \2 ~ {5 ?; E/ l) B' X) Q
cout > isbn;7 O% L ]2 y7 ?0 ?& X4 r
if (isbn==0)
* N/ j3 u6 r) |& b( J; R, [ break;
9 y3 o8 o* a- d" B vi.push_back(isbn); // insert element into vector
* J/ x8 j* i( R( Q }
& i" ?5 m5 Q. q& Q9 n2 w% T } |