C++STL 之 Vector

最近在阅读MyTinySTL源码,没有往深入里面研究,主要看各种容器的用法和区别,以此加深对各容器的熟悉程度。在博客上主要也是记录部分代码和运行效果,作为笔记日后可复习。

下面是C语言中文网对于vector的描述,这里只摘取其中一段。具体的内容请看链接http://c.biancheng.net/view/348.html

vector 是顺序容器的一种。vector 是可变长的动态数组,支持随机访问迭代器,所有 STL 算法都能对 vector 进行操作。要使用 vector,需要包含头文件 vector。

在 vector 容器中,根据下标随机访问某个元素的时间是常数,在尾部添加一个元素的时间大多数情况下也是常数,总体来说速度很快。

在中间插入或删除元素时,因为要移动多个元素,因此速度较慢,平均花费的时间和容器中的元素个数成正比。

在 vector 容器中,用一个动态分配的数组来存放元素,因此根据下标访问某个元素的时间是固定的,与元素个数无关。

vector 容器在实现时,动态分配的存储空间一般都大于存放元素所需的空间。例如,哪怕容器中只有一个元素,也会分配 32 个元素的存储空间。这样做的好处是,在尾部添加一个新元素时不必重新分配空间,直接将新元素写入适当位置即可。在这种情况下,添加新元素的时间也是常数。

但是,如果不断添加新元素,多出来的空间就会用完,此时再添加新元素,就不得不重新分配内存空间,把原有内容复制过去后再添加新的元素。碰到这种情况,添加新元素所花的时间就不是常数,而是和数组中的元素个数成正比。

至于在中间插入或删除元素,必然涉及元素的移动,因此时间不是固定的,而是和元素个数有关。

vector 有很多成员函数,常用的如表 1 所示。
 

表1: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  & v) 将容器自身的内容和另一个同类型的容器 v 互换

以下是vector类测试部分代码,主要是vector对象的定义

   std::cout << "[===============================================================]\n";
  std::cout << "[----------------- Run container test : vector -----------------]\n";
  std::cout << "[-------------------------- API test ---------------------------]\n";
  int a[] = { 1,2,3,4,5 };
  mystl::vector v1;
  mystl::vector v2(10);
  mystl::vector v3(10, 1);
  mystl::vector v4(a, a + 5);
  mystl::vector v5(v2);
  mystl::vector v6(std::move(v2));
  mystl::vector v7{ 1,2,3,4,5,6,7,8,9 };
  mystl::vector v8, v9, v10;
  v8 = v3;
  v9 = std::move(v3);
  v10 = { 1,2,3,4,5,6,7,8,9 };

这是运行后的效果

[===============================================================]
[----------------- Run container test : vector -----------------]
[-------------------------- API test ---------------------------]
 After v1.assign(8, 8) :    //vector v1调用函数assign 以下同理
 v1 : 8 8 8 8 8 8 8 8       //vector v1调用函数assign后效果  以下同理
 After v1.assign(a, a + 5) :
 v1 : 1 2 3 4 5
 After v1.emplace(v1.begin(), 0) :
 v1 : 0 1 2 3 4
 After v1.emplace_back(6) :
 v1 : 0 1 2 3 4 6
 After v1.push_back(6) :
 v1 : 0 1 2 3 4 6 6
 After v1.insert(v1.end(), 7) :
 v1 : 0 1 2 3 4 6 6 7
 After v1.insert(v1.begin() + 3, 2, 3) :
 v1 : 0 1 2 3 3 3 4 6 6 7
 After v1.insert(v1.begin(), a, a + 5) :
 v1 : 1 2 3 4 5 0 1 2 3 3 3 4 6 6 7
 After v1.pop_back() :
 v1 : 1 2 3 4 5 0 1 2 3 3 3 4 6 6
 After v1.erase(v1.begin()) :
 v1 : 2 3 4 5 0 1 2 3 3 3 4 6 6
 After v1.erase(v1.begin(), v1.begin() + 2) :
 v1 : 4 5 0 1 2 3 3 3 4 6 6
 After v1.reverse() :
 v1 : 6 6 4 3 3 3 2 1 0 5 4
 After v1.swap(v4) :
 v1 : 1 2 3 4 5
 *v1.begin() : 1
 *(v1.end() - 1) : 5
 *v1.rbegin() : 5
 *(v1.rend() - 1) : 1
 v1.front() : 1
 v1.back() : 5
 v1[0] : 1
 v1.at(1) : 2
 After change v1.data() :
 v1 : 10 20 30 4 5
 v1.empty() : false
 v1.size() : 5
 v1.max_size() : 4611686018427387903
 v1.capacity() : 16
 After v1.resize(10) :
 v1 : 10 20 30 4 5 0 0 0 0 0
 v1.size() : 10
 v1.capacity() : 16
 After v1.shrink_to_fit() :
 v1 : 10 20 30 4 5 0 0 0 0 0
 v1.size() : 10
 v1.capacity() : 10
 After v1.resize(6, 6) :
 v1 : 10 20 30 4 5 0
 v1.size() : 6
 v1.capacity() : 10
 After v1.shrink_to_fit() :
 v1 : 10 20 30 4 5 0
 v1.size() : 6
 v1.capacity() : 6
 After v1.clear() :
 v1 :
 v1.size() : 0
 v1.capacity() : 6
 After v1.reserve(5) :
 v1 :
 v1.size() : 0
 v1.capacity() : 6
 After v1.reserve(20) :
 v1 :
 v1.size() : 0
 v1.capacity() : 20
 After v1.shrink_to_fit() :
 v1 :
 v1.size() : 0
 v1.capacity() : 0
[ PASSED ]
[--------------------- Performance Testing ---------------------]
|---------------------|-------------|-------------|-------------|
|      push_back      |    500000   |   5000000   |  50000000   |
|         std         |      7ms    |     85ms    |   1171ms    |
|        mystl        |     14ms    |    106ms    |   1177ms    |
|---------------------|-------------|-------------|-------------|
[ PASSED ]
[----------------- End container test : vector -----------------]

 

你可能感兴趣的:(C++)