您的位置:首页 > 其它

vector对象的定义和初始化

2012-05-09 17:12 267 查看
3.3.1 vector对象的定义和初始化

vector类定义了好几种构造函数(2.3.3节),用来定义和初始化vector对象。表3-4列出了这些构造函数:

表3-4 几种初始化vector对象的方式

vector<T> v1;vector保存类型为T的对象。默认构造函数v1为空。
vector<T> v2(v1);v2是v1的一个副本。
vector<T> v3(n, i);v3包含n个值为i的元素。
vector<T> v4(n);v4含有值初始化的元素的n个副本。
1. 创建确定个数的元素

若要创建非空的vector对象,必须给出初始化元素的值。当把一个vector对象复制到另一个vector对象时,新复制的vector中每一个元素都初始化为原vector中相应元素的副本。但这两个vector对象必须保存同一种元素类型:

vector ivec1;                // ivec1 holds objects of type int

vector ivec2(ivec1);       // ok: copy elements of ivec1 into ivec2

vector svec(ivec1);    // error: svec holds strings, not ints

可以用元素个数和元素值对vector对象进行初始化。构造函数用元素个数来决定vector对象保存元素的个数,元素值指定每个元素的初始值:

vector ivec4(10, -1);     // 10 elements, each initialized to -1

vector svec(10, "hi!"); // 10 strings, each initialized to "hi!"

关键概念:vector对象动态增长

vector对象(以及其他标准库容器对象)的重要属性就在于可以在运行时高效地添加元素。因为vector增长的效率高,在元素值已知的情况下,最好是动态地添加元素。

正如第4章将介绍的,这种增长方式不同于C语言中的内置数据类型,也不同于大多数其他编程语言的数据类型。特别地,如果读者习惯了C或Java的风格,由于vector元素连续存储,可能希望最好是预先分配合适的空间。但事实上,为了达到连续性,C++的做法恰好相反,具体原因将在第9章探讨。

虽然可以对给定元素个数的vector对象预先分配内存,但更有效的方法是先初始化一个空vector对象,然后再动态地增加元素(我们随后将学习如何进行这样的操作)。

2. 值初始化

如果没有给出元素的初始化式,那么标准库将提供一个值初始化的(value initialized)元素初始化式。这个由库生成的初始值用于初始化容器中的每个元素。而元素初始化式的值取决于存储在vector中元素的数据类型。

如果vector保存内置类型(如int类型)的元素,那么标准库将用0值创建元素初始化值:

vector fvec(10); // 10 elements, each initialized to 0

如果向量保存类类型(如string)的元素,标准库将用该类型的默认构造函数创建元素初始值:

vector svec(10); // 10 elements, each an empty string

第12章将介绍一些有自定义构造函数但没有默认构造函数的类,在初始化这种类型的Vector对象时,程序员就不能仅提供元素个数,还需要提供元素初始值。

还有第三种可能性:元素类型可能是没有定义任何构造函数的类类型。这种情况下,标准库仍产生一个带初始值的对象,这个对象的每个成员进行了值初始化。

习题

习题3.11 下面哪些vector定义不正确?

(a) vector< vector > ivec;

(b) vector svec = ivec ;

(c) vector svec(10,”null”);

习题3.12 下列每个vector对象中元素个数是多少?各元素的值是什么?

(a) vector ivec1;

(b) vector ivec2(10);

(c) vector ivec3(10,42);

(d) vector svec1;

(e) vector svec2(10);

(f) vector svec3(10,”hello”);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐