C++ Primer 标准库类型Vector 笔记

vector
标准库类型vector表示对象的集合,其中所有对象的类型都相同。因为vector“容纳着”其他对象,所以它也常被称作容器(container)。第II部分将对容器进行更为详细的介绍。
C++语言中既有类模板(class template),也有函数模板,其中vector是一个类模板。自定义类模板在16章学习。
模板本身不是类或函数,相反可以将模板看作为编译器生成类或函数编写的一份说明。编译器根据模板创建爱你类或函数的过程称为实例化(instantiation),当使用模板时,需要指出编译器应把类或函数实例化成何种类型。
对于类模板,创建时必须在模板名字后面跟一对尖括号,尖括号内用于指定模板到底实例化成什么样的类。以vector为例,提供的额外信息是vector内存放对象的类型:

vector<int> ivec;
vector<Sales_item> Sales_vec;
vector<vector<string>> file;

定义和初始化 vector 对象

vector<T> v1;   // 默认初始化:v1是一个空vector,它潜在的元素是T类型的,执行默认初始化
vector<T> v2(v1);   // 直接初始化:v2中包含有v1所有元素的副本
vector<T> v2 = v1;   // 拷贝初始化:等价于v2(v1),v2中包含有v1所有元素的副本
vector<T> v3(n, val);   // 直接初始化:n指定了元素的数量,v3包含了n个重复的元素,每个元素的值都是val
vector<T> v4(n);   // 直接初始化:v4包含了n个重复地执行了值初始化的对象
vector<T> v5{a, b, c...};   // 列表初始化:v5包含了初始值个数的元素,每个元素被赋予相应的初始值
vector<T> v5={a, b, c...};   // 列表初始化:和上一行实质上是相同的

值初始化
通常情况下,可以只提供vector对象容纳的元素数量而不用提供初始值,此时库会创建一个值初始化的元素初值,并把它赋给容器中的所有元素。这个初值由vector对象中元素的类型决定。
如果vector对象的元素是内置类型,比如int,则元素初始值自动设为0(和默认初始化不同,这个即便vector定义在函数体内,int元素也会被自动设0)。如果元素是某种类类型,比如string,则元素由类默认初始化。对这种初始化方式有两个特殊限制:其一,有些类要求必须明确地提供初始值,如果vector对象中元素的类型不支持默认初始化,我们就必须提供初始的元素值。对这种类型的对象来说,只提供元素的数量而不设定初始值无法完成初始化工作。其二,如果只提供了元素的数量而没有设定初始值,只能使用直接初始化。

列表初始值还是元素数量?
对于vector类型变量的初始化,如果用圆括号,可以说提供的值是用来构造(construct)vector对象的,括号里的第一个常量如果是个数字的话就会被当做指定这个vector对象的元素个数,后面开始才是元素值。
如果用的是花括号,可以表述成我们想列表初始化该vector对象。也就是说,初始化过程会尽可能地把花括号内的值当成是元素初始值的列表来处理。只有在无法执行列表初始化时才会考虑其他方式,例如下例:

vector<string> v8{10, "hi"};   // v8有10个值为"hi"的元素

向vector对象中添加元素
对于vector对象来说,直接初始化适用于3种情况:初始值已知且数量较少、初始值是另一个vector对象的副本、所有元素的初始值都一样。然而更常见的情况是:创建一个vector对象时并不清楚实际所需的元素个数,元素的值也经常无法确定。总之,更多的时候需要动态的向vector对象中添加元素。
push_back() 函数负责把新元素压入vector对象的尾端,例如:

vector<int> v2;
for(int i = 0; i != 100; ++i)
	v2.push_back(i);

:如果循环体内部包含有向vector对象添加元素的语句,则不能使用范围for循环,具体原因见5.4.3节(p168)。范围for语句体内不应该改变其遍历序列的大小。

获取vector中的元素
使用下表运算符 [ ] 可以获取vector中的元素。和string一样,vector对象的下标也从0开始计起,下标的类型是相应的size_type类型。只要 vector对象不是一个常量,就能向下表运算符返回的元素赋值。
下标运算符( [ ] )接收的输入参数是vector::size_type类型的值(参见p79),这个参数表示要访问的元素的位置,返回值是该位置上元素的引用。
:vector对象(以及string对象)的下表运算符可用于访问已存在的元素,而不能用于添加元素。
试图用下标的形式去访问一个不存在的元素的行为非常常见,而且会产生很严重的后果。确保下标合法的一种有效手段就是尽可能使用范围for语句。

其他vector操作
v.empty():如果v不含有任何元素,返回真;否则返回假。
v.size():返回v中元素的个数。(v有10个元素,v.size()就是10)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值