Maine

纵有疾风起,人生不言弃

C++ 中的 vector(动态数组)

vector 介绍

《C++ STL容器》 一文中,我们介绍了 C++ 中的容器,容器分为顺序容器和关联容器,而我们现在要说的 vector 是一个封装了动态大小数组的顺序容器(Sequence Container),支持随机访问迭代器。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。

效率

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

成员函数

1.构造函数

  • vector():创建一个空vector
  • vector(int nSize):创建一个vector,元素个数为nSize
  • vector(int nSize, const T & val):假定元素的类型是 T,创建一个vector,元素个数为nSize,且值均为val
  • vector(const vector&):复制构造函数
  • vector(iterator first, iterator last): first 和 last 可以是其他容器的迭代器。一般来说,函数初始化的结果就是将 vector 容器的内容变成与其他容器上的区间 [first, last) —致

2.插入函数

  • void push_back(const T& x):向量尾部增加一个元素X
  • iterator insert(iterator it,const T& x):vector中迭代器指向元素前增加一个元素x
  • iterator insert(iterator it,int n,const T& x):vector 中迭代器指向元素前增加n个相同的元素x
  • iterator insert(iterator it,const_iterator first,const_iterator last):vector中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据

3.删除函数

  • iterator erase(iterator it):删除vector中迭代器指向元素
  • iterator erase(iterator first,iterator last):删除vector 中[first,last)中元素
  • void pop_back():删除vector中最后一个元素
  • void clear():清空vector中所有元素

4.遍历函数

  • reference at(int pos):返回pos位置元素的引用
  • reference front():返回首元素的引用
  • reference back():返回尾元素的引用
  • iterator begin():返回向量头指针,指向第一个元素
  • iterator end():返回向量尾指针,指向vector最后一个元素的下一个位置
  • reverse_iterator rbegin():反向迭代器,指向最后一个元素
  • reverse_iterator rend():反向迭代器,指向第一个元素之前的位置

5.判断函数

  • bool empty() const :判断vector是否为空,若为空,则vector中无元素

6.大小函数

  • int size() const:返回vector中元素的个数
  • int capacity() const:返回当前vector中所能容纳的最大元素值
  • int max_size() const:返回最大可允许的vector元素数量值

7.其他函数

  • void swap(vector&):交换两个同类型vector的数据
  • void assign(int n,const T& x):设置向量中第n个元素的值为x
  • void assign(const_iterator first,const_iterator last) :向量中[first,last)中元素设置成当前向量元素

基本用法:

1. 引入相关头文件

#include < vector> 
using namespace std;

2. 在 vector 末尾插入或移除元素

#include <iostream>
#include <vector>
using namespace std;

int main(int argc, const char * argv[]) {
    vector<int> v;
    for (int i=0; i<10; ++i) {
        // 使用 push_back 插入元素
        v.push_back(i);
        cout << i << " ";
    }
    cout << endl;

    for (int i=0; i<5; ++i) {
        v.pop_back();
    }

    // size() 获取 vector 元素个数
    for (int i=0; i<v.size(); ++i) {
        // 使用下标访问元素
        cout << v[i] << " ";
    }
    cout << endl;

    return 0;
}

输出:

0 1 2 3 4 5 6 7 8 9 
0 1 2 3 4 

3. 遍历(访问) vector

以下示例摘自 《C++ STL迭代器( iterator )》,有数组方式遍历和迭代器遍历,不了解迭代器的话,也可以看看这一篇。

示例:

#include <iostream>
#include <vector>
using namespace std;

int main(int argc, const char * argv[]) {

    vector<int> v;              // 定义一个 int 类型的可变长数组
    for (int i=0; i<10; ++i) {
        v.push_back(i);         // push_back 在 vector 容器尾部添加元素
    }

    // 1. 使用下标遍历
    for (int i=0; i<v.size(); ++i) {
        cout << v[i] << " ";
    }
    cout << endl;

    // 2. 使用 != 条件遍历
    vector<int>::iterator iter;
    for (iter = v.begin(); iter != v.end(); ++iter) {
        cout << *iter << " ";
    }
    cout << endl;

    // 3. 使用 < 条件遍历
    for (iter = v.begin(); iter < v.end(); ++iter) {
        cout << *iter << " ";
    }
    cout << endl;

    // 4. 随机访问达到间隔输出
    iter = v.begin();
    while (iter < v.end()) {
        cout << *iter << " ";
        iter += 2;
    }
    cout << endl;

    return 0;
}
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注