人小鬼不大

导航

 

1、简介

  vector 是顺序容器的一种。vector 是可变长的动态数组,支持随机访问迭代器,所有 STL 算法都能对 vector 进行操作。要使用 vector,需要包含头文件 vector。
  在 vector 容器中,根据下标随机访问某个元素的时间是常数,在尾部添加一个元素的时间大多数情况下也是常数,总体来说速度很快。在中间插入或删除元素时,因为要移动多个元素,因此速度较慢,平均花费的时间和容器中的元素个数成正比。
  在 vector 容器中,用一个动态分配的数组来存放元素,因此根据下标访问某个元素的时间是固定的,与元素个数无关。
  vector 容器在实现时,动态分配的存储空间一般都大于存放元素所需的空间。例如,哪怕容器中只有一个元素,也会分配 32 个元素的存储空间。这样做的好处是,在尾部添加一个新元素时不必重新分配空间,直接将新元素写入适当位置即可。在这种情况下,添加新元素的时间也是常数。但是,如果不断添加新元素,多出来的空间就会用完,此时再添加新元素,就不得不重新分配内存空间,把原有内容复制过去后再添加新的元素。碰到这种情况,添加新元素所花的时间就不是常数,而是和数组中的元素个数成正比。
至于在中间插入或删除元素,必然涉及元素的移动,因此时间不是固定的,而是和元素个数有关。

2、vector常用的成员函数

  vector() 无参构造函数,将容器初始化为空

  vector(int n) 将容器初始化为有 n 个元素
  vector(int n, const T & val) 假定元素的类型是 T,此构造函数将容器初始化为有 n 个元素,每 个元素的值都是 val
  vector(iterator first, iterator last) first 和 last 可以是其他容器的迭代器。一般来说,本构造函数初始化的结果就是将 vector 容器的内容变成与其他容器上的区间 [first, last) —致
  void clear() 删除所有元素
  bool empty() 判断容器是否为空
  void pop_back() 删除容器末尾的元素
  void push_back( const T & val) 将 val 添加到容器末尾
  int size() 返回容器中元素的个数
  T & front() 返回容器中第一个元素的引用
  T & back() 返回容器中最后一个元素的引用
  iterator insert(iterator i, const T & val) 将 val 插入迭代器 i 指向的位置,返回 i
  iterator insert( iterator i, iterator first, iterator last) 将其他容器上的区间 [first, last) 中的元素插入迭代器 i 指向的位置
  iterator erase(iterator i) 删除迭代器 i 指向的元素,返回值是被删元素后面的元素的迭代器
  iterator erase(iterator first, iterator last) 删除容器中的区间 [first, last)
  void swap( vector <T> & v) 将容器自身的内容和另一个同类型的容器 v 互换

  vector< vector<int> > v(3);

3、数据结构

  线性空间。它以两个迭代器start和finish分别指向配置得来的连续空间中目前已经被使用的范围,并以迭代器end_of_storage指向整块连续空间的尾端:

 1 template<class T, class Alloc = alloc>
 2 
 3 class vector {
 4 
 5   ...
 6 
 7 protected:
 8   iterator start;    //表示目前使用空间的头
 9   iterator finish;   //表示目前使用空间的尾
10   iterator end_of_storage; //表示目前可用空间的尾
11 
12 };
View Code

为了降低空间配置时的速度成本,vector实际配置的大小可能比客户端需求更大一些,以备将来可能的扩充。

4、vector的构造与内存管理

  当我们以push_back()将新元素插入vector尾端时,该函数首先检查是否还有备用空间,如果有就直接在备用空间上构造元素,并调整迭代器finish,使vector变大。如果没有备用空间了,就扩充空间(重新配置、移动数据、释放原空间)。
  注意:所谓动态增加大小,并不是在原空间之后接续新空间,而是以原大小的两倍另外配置一块较大空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。因此,对vector的任何操作,一旦引起空间的重新配置,指向原vector的所有迭代器就都失效了。

posted on 2020-01-20 14:25  人小鬼不大  阅读(271)  评论(0编辑  收藏  举报