type
status
date
slug
summary
tags
category
icon
password
Property
标准库类型
vector
表示对象的集合,也叫做容器,定义在头文件vector
中。vector
中所有对象的类型都相同,每个对象都有一个索引与之对应并用于访问该对象。C++
中同时有类模板和函数模板,vector
是一个类模板。模板本身不是函数或者类,但是当提供实例化参数时,编译器会帮助生成新的函数或者类,这个过程叫做实例化。实例化参数包含在模板名称后的尖括号中,如:
vector<int>
和vector<vector<string>>
,可以将 vector
实例化为包含绝大多数类型,甚至元素可以是 vector
。注:早期的
C++
标准中,如果vector
的元素还是vector
(或者其他模板类型),则其定义的形式与现在的C++11
新标准略有不同。过去,必须在外层vector
对象的右尖括号和其元素类型之间添加一个空格,如应该写成vector<vector<int> >
而非vector<vector<int>>
。vector
中的元素是顺序存储的,意味着元素不仅仅可以通过迭代器进行访问,并且可以使用元素指针的偏移进行访问。这就是说可以将vector
元素的指针传递给一个期待数组元素指针的函数。定义和初始化 vector
初始化
vector
对象的方法:可以默认初始化
vector
对象,从而创建一个指定类型的空vector
:空的
vector
看起来没什么用,可其实是最常用的方式。惯用的方式是先定义一个空的 vector
,然后在运行时不断添加元素。添加元素本身是一个高效的操作。初始化
vector
对象时:- 如果使用圆括号,可以说提供的值是用来构造
vector
对象
- 如果使用的是花括号,则是在列表初始化
vector
对象
当只提供个数而不提供初始值,
vector
会对元素进行值初始化,值初始化对于类类型是调用类的默认构造函数,对于内置类型则初始化为 0 。值初始化保证一定有值,而默认初始化对于类类型将调用类的默认构造函数,对于内置类型则在函数外初始化为 0 ,在函数内作为自动变量则是未定义值。值初始化和默认初始化的一个有意思的例子是,在函数内定义数组,如果不进行初始化则为默认初始化,其中的所有元素都是未定义值,而如果提供少量的初始值,其它元素则执行值初始化为0 :
打印以上数组就会发现不同
如果类类型的元素没有默认构造函数,则无法定义只包含个数的
vector
。对于无法执行列初始化时,会转而直接调用构造函数:为了达到列初始化,必须使得大括号中的值的类型与元素的类型匹配。
添加元素
vector
使用 push_back
函数进行添加元素。对vector
进行添加元素是非常高效的,通常,在C++
中不会预先给 vector
分配个数。将一个元素添加到
vector
中,事实上是将其拷贝一份然后添加到vector
中。vector 的其它操作
vector
中包含另外一些类似于 string
类的成员函数:vector
和 string
对象的下标运算符只能用来访问已经存在的元素,而不能用来添加元素只能对确知已存在的元素执行下标操作:
size
函数返回的类型需要包含元素类型,如:vector<int>::size_type
。字典比较的意思是依次比较向量中的每个元素,当遇到第一个不一致的元素时,较大的元素的向量较大,如果所有元素都是一样,则根据长度判断,较长的向量较大。只有当可以比较向量的元素值时可以比较向量。
vector
和string
的下标运算一样,索引是size_type
类型,是一个无符号整数,当索引超出范围时,其行为是未定义的。这种越界是非常常见而且难以定位的问题,称之为缓冲溢出(buffer overflow),但是C++
并不试图阻止程序员这样做,甚至在标准库容器中也不阻止,string
和vector
的下标操作同样会产生未定义行为而不是抛出异常。正确的添加方法是使用
push_back
: