构建一种新类型的第一步通常是把所需的元素组织成一种数据结构。下面是一个 struct的示例:
struct Vector{int sz; //元素的数量double elem; //指向元素的指针};
这是 Vector的第一个版本,其中包含一个int和一个 double*。
一个 Vector类型的变量可以通过下述形式进行定义:
Vector v;
仅就v本身而言,它的用处似乎不大,因为v的eem指针并没有指向任何实际的内容。为了让它变得更有用,我们需要令ⅴ指向某些元素。例如,我们可以构造一个如下所示的Vector:
void vector_init(Vector& v,int s){v.elem=new double[s]; //分配一个数组,它包含s个double的值v.sz=s;}
也就是说,v的elem成员被赋予了一个由new运算符生成的指针,而sz成员的值则是元素的个数。 Vector&中的符号&指定我们通过非常量引用(见22.5节和7.7节)的方式传递v,这样 vector inite()就能修改传入其中的向量了。
new运算符从一块名为自由存储( free store)(又称为动态内存( dynamic memory)或堆
(heap),见112节)的区域中分配内存。
Vector的一个简单应用如下所示:
double read_and_sum(int s) //从cin读入s个整数,然后返回这些整数的和;其中,嘉定s是正的{Vector v;vector_init(v,s);for(int i=0;i!=s;i++)cin>>v.elem[i]; //读入元素double sum=0;for(int i=0;i!=s;i++)sum+=v.elem[i]; // 计算元素的和return sum;}
显然,在灵活性和优雅程度上我们的Ⅴector与标准库 vector还有很大差距,尤其是Vector的使用者必须清楚地知道它的所有细节。本章余下的部分以及下一章将把 Vector当作呈现语言特性和技术的一个示例,一步步地完善它。作为对比,第4章将介绍标准库vector,在其中蕴含着很多漂亮的改进,第31章将结合其他标准库功能呈现完整的 vector。
本书使用 vector和其他标准库组件作为示例,试图达到以下两个目的:
- 展现语言特性和程序设计技术;
- 帮助读者学会使用这些标准库组件。
忠告:与其试着重写 vector和 string等标准库组件,不如直接将它们拿来使用。
访问 struct成员的方式有两种:一种是通过名字或引用,这时我们使用.(点运算符);另一种是通过指针,这时用到的是->。例如:
void f(Vector v,Vector& rv,Vector* pv){int i1=v.sz; //通过名字访问int i2=rv.sz; //通过引用访问int i4=pv->sz //通过指针访问}
