C++ STL vector

vector

vector表示对象的集合,所有的对象类型都相同,因为vector容纳着其他对象,所以vector也叫容器。
vecotr在头文件vector中,使用前需要包含该头文件,并进行using声明:

1
2
3
#include<vector>

using std::vector;

vector是一个类模板而不是类型。模板本身不是类或者函数,可以将模板看成编译器生成类或者函数编写的一份说明,编译器根据模板创建类或者函数的过程称为实例化,使用模板时需要指出编译器应该把类或者函数实例化成什么类型。
在模板名字后面跟上一对尖括号,括号内为具体的类型说明。

1
2
vector<int> ivec;   //表示int类型的vector
vector< vector<string> > file //vector中是string的vector。

vector对象的初始化

  • 默认初始化

    1
    vector<string> svec;    //默认初始化,不含任何元素

  • 列表初始化

  1. 元素的初值只能放在花括号内,不能放在圆括号内
  2. 给定类内初始值时只能使用拷贝初始化或者列表初始化。
1
vector<string> c = {"hello", "world"};
  • 值初始化
  1. 只提供给vector对象容纳的元素数量而不用略去初始值。会创建一个值初始化的元素初值,并把它赋给容器中所有元素,这个初始值由vector对象中元素类型决定。
  2. 如果vector对象中元素类型是内置类型,如int,初始值自动设置为0。
  3. 如果是某种类类型,比如string,由类默认初始化。
  4. 有些类要求必须显式的给出初始值。如果vector中对象不支持默认初始化,必须提供初始值。
  5. 如果值提供了元素的数量而没有设定初值,只能使用直接初始化。
  6. 初始化的真实含义依赖于传递初始值时用的是花括号还是圆括号。花括号进行列表初始化,圆括号提供的信息构造vecotr对象。如果使用花括号中的形式,但是提供的值不能用来列表初始化,考虑使用值构造vector对象。但是如果使用圆括号提供不能构造vector对象的值,不能用来进行列表初始化。也就是说花括号可以用来列表初始化,也可以用来构建vector对象,但是圆括号只能用来构建vector对象。

vector添加元素

直接初始化的方式适用于三种情况:

  1. 初始值已知,且数量较少
  2. 初始值是另一个vector对象的副本
  3. 所有元素的初始值都一样。

而当我们并不知道vector中有几个元素,元素的值也不知道的时候,就不适用直接初始化了,这个时候需要调用vector的成员函数push_back向其添加元素。

vector的最大优势是运行时能够高效的添加元素,它的容量能够在不够的时候,高效的增长,这样子在定义vector对象时设定大小没有太大的意义。只有一种情况,就是所有的元素值都一样的时候,指定vector的大小和初始值。否则更建议定义空的vector,然后向其中添加具体的而值。

vector对象的操作

  1. vector的大小
  2. vector添加新的元素
  3. 下标[]只能用于访问元素,不能用于添加元素。通过下标访问超出vector范围的元素的行为非常常见,这种错误叫做缓冲区溢出。