【C++】STL - 向量 vector

目录

一、什么是 vector?

二、vector 的定义和初始化

2.1 vector 的定义

2.2 vector 的初始化

三、vector 容器内的元素访问

3.1 通过下标访问

3.2 通过迭代器访问

3.3 误区

四、vector 的常用函数

五、vector 的常用算法

六、vector 的常见用途


一、什么是 vector?

向量(vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。与任意其它类型容器一样,它能够存放各种类型的对象。可以说,向量是一个能够存放任意类型的动态数组。

vector 的数据安排及操作方式,与 array 非常相似,两者的唯一差别在于空间的运用的灵活性。

  • array 是静态空间,一旦配置了就不能改变,如果要重新改变大小,首先要配置一块新的空间,然后将旧空间的数据搬到新开辟空间,再释放原来的空间;
  • vector 是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素,因此 vector 的运用对于内存的合理利用与运用的灵活性有很大的帮助。

使用时需包含头文件

    #include <vector> 
    using namespace std;

vector 容器特性:

  • 顺序序列:顺序容器中的元素按照严格的线性顺序排序,可以通过元素在序列中的位置访问对应的元素;
  • 动态数组:支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算术进行该操作,提供了在序列末尾相对快速地添加 / 删除元素的操作;
  • 能够感知内存分配器(Allocator-aware):容器使用一个内存分配器对象来动态地处理它的存储需求。

二、vector 的定义和初始化

2.1 vector 的定义

    vector<类型名> 变量名;  

其中,类型名可以是int、double、char、struct,也可以是STL容器:vector、set、queue。 

    // 举例
    vector<int> name;
    vector<double> name;
    vector<char> name;
    vector<struct node> name;
    vector<vector<int> > name;  // 注意:> >之间要加空格

vector 数组就是一个一维数组,如果定义成 vector 数组的数组,那就是二维数组。低维是高维的地址。在二维数组中,它的一维形式就是地址。

    vector<int> array[SZIE];  // SIZE确定后,行不可变,列可变
    vector<vector<int> > v;    // 二维变长数组,行列均可变化
    // 定义行长度为n+1,列长度为m+1,初始值为0的二维数组
    vector<vector<int> > v(n+1,vector<int>(m+1,0));  

2.2 vector 的初始化

  • 定义了10个整型元素的向量(尖括号中为元素类型名),但没有给出初值,其值不确定
    vector<int> v(10);
  • 定义了10个整型元素的向量,且给出每个元素的初值为1
    vector<int> v(10, 1);
  •  用 b 向量来创建 v 向量,整体复制性赋值
    vector<int> v(a);
  • 定义了 v 值为 b 中第 0 个到第 2 个元素
    vector<int> v(b.begin(), b.begin + 3);
  • 从数组中获得初值 
    int b[7] = { 1, 2, 3, 4, 5, 9, 8 };    
    vector<int> v(b, b+7);

    vector<int> v{ 1, 2, 3, 4, 5 };

注意:指定 vector 长度后就相当于一个普通数组 array


三、vector 容器内的元素访问

3.1 通过下标访问

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

    int main(){
        vector<int> v;
        v.push_back(1);
        cout << v[0] << endl;
        return 0;
    }

    // 输出结果
    1

3.2 通过迭代器访问

迭代器(iterator)可以理解为指针,定义如下:

    vector<类型名>::iterator 变量名;
    #include <iostream>
    #include <vector>
    using namespace std;

    int main(){
        vector<int> v;
        for (int i = 0; i < 5; i++)
        {
            v.push_back(i);
        }
        // v.begin()返回v的首元素地址
        vector<int>::iterator it = v.begin();
        for (int i = 0; i < v.size(); i++)
        {
           cout << it[i] << " ";
        }
        return 0;
    }

    // 输出结果
    0 1 2 3 4

其中,如下两个写法等价,即

    it[i] = *(it + i)

for 循环迭代部分一般写成如下形式:

    // vector的迭代器不支持it<v.end()的写法,因此循环条件只能it!=v.end()
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";
    }

3.3 误区

以下及类似做法都是错误的,下标只能用于获取已存在的元素,而现在的 a[i] 还是空的对象。

    vector<int> a;
    for(int i = 0; i < 10; i++)
        a[i] = i;

四、vector 的常用函数

    v.at(n);                 // 返回指定编号位置n的数据	
    v.front();               // 返回第一个数据O(1) 
	v.back();                // 返回最后一个数据O(1) 
	v.pop_back();            // 删除最后一个数据O(1) 
	v.push_back(element);    // 在数组尾部添加一个数据
	v.size();                // 返回数组元素个数O(1)
	v.clear();               // 清除数组
	v.resize(n, num);        // 改变数组大小为n,n个空间数值赋值为num,默认为0 
	v.insert(it.num);        // 向任意迭代器it插入一个元素x
	v.insert(c.begin()+2, -1);  // 将-1插入到v[2]的位置
    v.erase(v.begin()+3);    // 删除v[3]位置的元素
	v.erase(first, last);    // 删除[first, last)的所有元素  
	v.begin();               // 返回首元素的迭代器
	v.end();                 // 返回最后一个元素的后一个位置的迭代器
	v.empty();               // 判断是否为空,为空返回true,否则返回false
    v.rbegin();              // 返回vector反转后的开始指针(即原来的end-1)
    v.rend();                // 返回vector反转后的结束指针(即原来的begin-1)

五、vector 的常用算法

  • 头文件
    #include <algorithm>
  • 对 a 中从 a.begin() 到 a.end() 的元素进行从小到大排列
    sort(a.begin(), a.end()); 
  • 对 a 中从 a.begin() 到 a.end() 的元素反转,但不排列,如 a 中元素为 1, 3, 2, 4,反转后为 4, 2, 3, 1
    reverse(a.begin(), a.end()); 
  • 把 a 中从 a.begin() 到 a.end() 的元素复制到 b 中,从 b.begin() + 1 的位置(包括)开始复制,覆盖原有元素
    copy(a.begin(), a.end(), b.begin() + 1); 
  • 在 a 中从 a.begin() 到 a.end() 的元素中查找10,若存在则返回其在向量中的位置
    find(a.begin(), a.end(), 10); 

注意:以上区间均取左闭右开。


六、vector 的常见用途

  • 储存数据:vector 本身可以作为数组使用,当元素个数不确定时可以很好地节省空间;
  • 用邻接表存储图:使用 vector 实现邻接表,更为简单。
  • 11
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值