vector
vector
表示对象的集合,所有的对象类型都相同,因为vector
容纳着其他对象,所以vector
也叫容器。
vecotr
在头文件vector
中,使用前需要包含该头文件,并进行using
声明:
1 |
|
vector
是一个类模板而不是类型。模板本身不是类或者函数,可以将模板看成编译器生成类或者函数编写的一份说明,编译器根据模板创建类或者函数的过程称为实例化,使用模板时需要指出编译器应该把类或者函数实例化成什么类型。
在模板名字后面跟上一对尖括号,括号内为具体的类型说明。
1 | vector<int> ivec; //表示int类型的vector |
vector对象的初始化
-
默认初始化
1
vector<string> svec; //默认初始化,不含任何元素
-
列表初始化
- 元素的初值只能放在花括号内,不能放在圆括号内
- 给定类内初始值时只能使用拷贝初始化或者列表初始化。
1 | vector<string> c = {"hello", "world"}; |
- 值初始化
- 只提供给vector对象容纳的元素数量而不用略去初始值。会创建一个值初始化的元素初值,并把它赋给容器中所有元素,这个初始值由
vector
对象中元素类型决定。 - 如果
vector
对象中元素类型是内置类型,如int
,初始值自动设置为0。 - 如果是某种类类型,比如
string
,由类默认初始化。 - 有些类要求必须显式的给出初始值。如果
vector
中对象不支持默认初始化,必须提供初始值。 - 如果值提供了元素的数量而没有设定初值,只能使用直接初始化。
- 初始化的真实含义依赖于传递初始值时用的是花括号还是圆括号。花括号进行列表初始化,圆括号提供的信息构造
vecotr
对象。如果使用花括号中的形式,但是提供的值不能用来列表初始化,考虑使用值构造vector
对象。但是如果使用圆括号提供不能构造vector
对象的值,不能用来进行列表初始化。也就是说花括号可以用来列表初始化,也可以用来构建vector
对象,但是圆括号只能用来构建vector
对象。
vector添加元素
直接初始化的方式适用于三种情况:
- 初始值已知,且数量较少
- 初始值是另一个
vector
对象的副本 - 所有元素的初始值都一样。
而当我们并不知道vector
中有几个元素,元素的值也不知道的时候,就不适用直接初始化了,这个时候需要调用vector
的成员函数push_back
向其添加元素。
vector
的最大优势是运行时能够高效的添加元素,它的容量能够在不够的时候,高效的增长,这样子在定义vector
对象时设定大小没有太大的意义。只有一种情况,就是所有的元素值都一样的时候,指定vector
的大小和初始值。否则更建议定义空的vector
,然后向其中添加具体的而值。
vector
对象的操作
vector
的大小- 向
vector
添加新的元素 - 下标
[]
只能用于访问元素,不能用于添加元素。通过下标访问超出vector
范围的元素的行为非常常见,这种错误叫做缓冲区溢出。