Vector容器

 标准库 vector 类型

vector 是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。

string 对象一样,标准库将负责管理与存储元素相关的内存。我们把 vector 称为容器,是因为它可以包含其他对象。一个容器中的所有对象都必须是同一种类型的。我们将在第九章更详细地介绍容器。使用 vector 之前,必须包含相应的头文件。本书给出的例子,都是假设已作了相应的 using 声明:

#include <vector>

using std::vector;

vector 是一个类模板(class template )。使用模板可以编写一个类定义或函数定义,而用于多个不同的数据类型。因此,我们可以定义保存 string 对象的 vector ,或保存 int 值的 vector ,又或是保存自定义的类类型对象(如Sales_items 对象)的 vector 。将在第十六章介绍如何定义程序员自己的类模板。幸运的是,使用类模板时只需要简单了解类模板是如何定义的就可以了。声明从类模板产生的某种类型的对象,需要提供附加信息,信息的种类取决于模板。以 vector 为例,必须说明 vector 保存何种对象的类型,通过将类型放在类型放在类模板名称后面的尖括号中来指定类型:

vector<int> ivec; // ivec holds objects of type int

vector<Sales_item> Sales_vec; // holds Sales_items

和其他变量定义一样,定义 vector 对象要指定类型和一个变量的列表。上面的第一个定义,类型是 vector<int> ,该类型即是含有若干 int 类型对象的vector ,变量名为 ivec 。第二个定义的变量名是 Sales_vec ,它所保存的元素是 Sales_item 类型的对象。

vector 不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。vector 类型的每一种都指定了其保存元素的类型。因此,vector<int> vector<string> 都是数据类型。

1.      vector 对象的定义和初始化

vector 类定义了好几种构造函数,用来定义和初始化 vector 对象。下表列出了这些构造函数。

 

 

创建确定个数的元素

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

vector<int> ivec1; // ivec1 holds objects of type int

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

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

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

vector<int> ivec4(10, -1); // 10 elements, each initialized

to -1

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

"hi!"

 

 

 

值初始化

如果没有指定元素的初始化式,那么标准库将自行提供一个元素初始值进行值初始化(value initializationd )。这个由库生成的初始值将用来初始化容器中的每个元素,具体值为何,取决于存储在 vector 中元素的数据类型。

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

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

如果 vector 保存的是含有构造函数的类类型(如 string )的元素,标准库将用该类型的默认构造函数创建元素初始化式:

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

第十二章将介绍一些有自定义构造函数但没有默认构造函数的类,在初始化这种类型的 vector 对象时,程序员就不能仅提供元素个数,还需要提供元素初始值。还有第三种可能性:元素类型可能是没有定义任何构造函数的类类型。这种情况下,标准库仍产生一个带初始值的对象,这个对象的每个成员进行了值初始化。

2.    vector 对象的操作

vector 标准库提供了许多类似于 string 对象的操作,下表列出了几种最重要的 vector 操作。

 

 

 

vector 对象的 size

empty size 操作类似于 string 的相关操作。成员函数size 返回相应 vector 类定义的 size_type 的值。使用 size_type 类型时,必须指出该类型是在哪里定义的。vector 类型总是包括总是包括 vector 的元素类型:

vector<int>::size_type // ok

vector::size_type // error

vector 添加元素

push_back 操作接受一个元素值,并将它作为一个新的元素添加到 vector 对象的后面,也就是“插入(push )”到 vector 对象的“后面(back )”:

// read words from the standard input and store them as elements in a vector

string word;

vector<string> text; // empty vector

while (cin >> word)

{

text.push_back(word); // append word to text

}

该循环从标准输入读取一系列 string 对象,逐一追加到 vector 对象的后面。首先定义一个空的 vector 对象 text 。每循环一次就添加一个新元素到vector 对象,并将从输入读取的 word 值赋予该元素。当循环结束时,text 就包含了所有读入的元素。

vector 的下标操作

vector 中的对象是没有命名的,可以按 vector 中对象的位置来访问它们。通常使用下标操作符来获取元素。vector 的下标操作类似于 string 类型的下标操作。

vector 的下标操作符接受一个值,并返回 vector 中该对应位置的元素。vector 元素的位置从 0 开始。下例使用 for 循环把 vector 中的每个元素值都重置为 0

// reset the elements in the vector to zero

for (vector<int>::size_type ix = 0; ix != ivec.size(); ++ix)

ivec[ix] = 0;

string 类型的下标操作符一样,vector 下标操作的结果为左值,因此可以像循环体中所做的那样实现写入。另外,和 string 对象的下标操作类似,这里用 size_type 类型作为 vector 下标的类型。在上例中,即使 ivec 为空,for 循环也会正确执行。ivec 为空则调用 size 返回 0 ,并且 for 中的测试比较 ix 0 。第一次循环时,由于 ix 本身就是 0 就是 0 ,则条件测试失败,for 循环体一次也不执行。

下标操作不添加元素

初学 C++ 的程序员可能会认为 vector 的下标操作可以添加元素,其实不然:

vector<int> ivec; // empty vector

for (vector<int>::size_type ix = 0; ix != 10; ++ix)

ivec[ix] = ix; // disaster: ivec has no elements

 

 

 

上述程序试图在 ivec 中插入 10 个新元素,元素值依次为 0 9 的整数。但是,这里 ivec 是空的 vector 对象,而且下标只能用于获取已存在的元素。这个循环的正确写法应该是:

for (vector<int>::size_type ix = 0; ix != 10; ++ix)

ivec.push_back(ix); // ok: adds new element with value ix

必须是已存在的元素才能用下标操作符进行索引。通过下标操作进行赋值时,不会添加任何元素。

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值