C++ Primer_4th学习笔记(7)- 标准库 vector 类型


3.3. 标准库 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> 都是数据类型


3.3.1. 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!"); // 10 strings, each initialized to
"hi!"

关键概念:vector 对象动态增长
vector 对象(以及其他标准库容器对象)的重要属性就在于可以在运行
时高效地添加元素。因为 vector 增长的效率高,在元素值已知的情况
下,最好是动态地添加元素。
正如第四章将介绍的,这种增长方式不同于 C 语言中的内置数据类型,
也不同于大多数其他编程语言的数据类型。具体而言,如果读者习惯了 C
或 Java 的风格,由于 vector 元素连续存储,可能希望最好是预先分
配合适的空间。但事实上,为了达到连续性,C++ 的做法恰好相反,具
体原因将在第九章探讨。
虽然可以对给定元素个数的 vector 对象预先分配内
存,但更有效的方法是先初始化一个空 vector 对象,
然后再动态地增加元素(我们随后将学习如何进行这样
的操作)。


值初始化
如果没有指定元素的初始化式,那么标准库将自行提供一个元素初始值进行
值初始化(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 对象时,程序员就不能仅提
供元素个数,还需要提供元素初始值。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值