0%

cpp数据结构之vector的常见用法

本文是关于c++中常用的数组vector的一些常见用法的总结, 主要是一些常用的调用方法, 主要是我的平时的leetcode题解中经常会使用的.

数组 vector

一般大家应该都学习过C语言, 在C语言中, 数组通常使用int[]来表示, 但是在使用的过程中, 通常会出现一些麻烦(大佬轻喷), 比如静态初始化大小不能直接使用参数而是一个常量, 动态申请空间需要使用malloc等. 虽然手动分配内存可能会给代码带来一定的效率提升, 但是复杂的细节操作让我这个从python转来刷题应试的小白很难接受呀.

所以一般直接使用标准库提供的vector(很多人都是这么建议的), 这个是比int[]更加的高级的容器, 可以自动扩容, 让你不需要操心细节, 非常nice👨💻!

那么接下来我们来看一下vector的一些常见用法吧:

常见用法

首先需要导入标准库

1
#include<vector>

初始化

一维数组初始化

1
2
3
4
vector<int> res1;  //简单初始化一个空数组
vector<int> res2(n+1); //初始化大小为 n+1 大小的数组
vector<int> res3(n+1, 666); //初始化大小为 n+1 大小的数组, 初始值为 666
vector<int> res4{1,2,3,4}; // 直接初始化内容

二维数组初始化

1
2
3
4
5
vector<vector<int>> res1;  // 初始化一个二维数组;
vector<vector<int>> res2(m, vmctor<int>(n, 2)); // 初始化一个二维数组, 大小为m*n, 默认值为2.

// 重置大小
res.resize(m, vector<int>(n));

其中的元素也可以是其他类型, 例如string, bool等.

查询属性

  1. 数组大小

    1
    res.size();  // 返回数组的大小

  2. 判断数组是否为空

    1
    res.empty();

  3. 返回数组头的指针

    1
    res.begin();

  4. 返回数组尾+1的指针, 注意是指向最后的后一个, 也就是空

    1
    res.end();

  5. 得到数组头的引用

    1
    res.front();

  6. 得到数组尾的引用

    1
    res.back();

增删改查

  1. 增加元素

    1
    res.push_back(元素);  // 在尾部插入一个元素

  2. 删除元素

    1
    2
    res.pop_back(元素);  // 删除最后一个元素
    res.erase(res.begin() + i); // 删除第i个元素

  3. 修改元素

    1
    res[pos] = 值;  //  直接在第pos个位置修改为某个值

  4. 查找元素(按索引查找)

    1
    res[pos];  // 直接查找第pos个位置的元素

  5. 那如果想查找值是否在数组中(按值查找) vector没有直接的方法, 就需要使用标准库中的find方法来查找(这也是我写这篇的起因, 以后还有不懂的就加进来).

    1
    2
    #include<algorithm>  // 首先必须导入标准库, 该库提供了大量基于迭代器的模板函数
    find(res.begin(), res.end(), key); // 返回范围内第一个等于给定key的元素位置指针, 一般用于判断是否存在

其他

  1. 重新定义数组大小

    1
    res.resize(m);  // 数组大小重新定义为m

  2. 清空数组

    1
    res.clear();  // 清空数组

  3. 与另一个数组交换数据

    1
    swap(res1, res2);  // res1与res2交换数组

  4. 数组求和 需要借助库函数numeric实现

    1
    2
    #include<numeric>
    accumulate(nums.begin(), nums.end(), 0) // 从0为基准开始求和

  5. 数组排序 需要借助库函数algorithm实现

    1
    2
    3
    #include<algorithm>
    sort(nums.begin(), nums.end()); // 数组升序
    sort(nums.begin(), nums.end(), greater<int>()); // 数组降序

    对于二维数组, 也可以自定义cmp函数, 实现一列升序, 一列降序的方法.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 按照第一列降序排序
    // 第一列相等按照第二列升序
    static bool cmp(vector<int> &a, vector<int> &b){
    if(a[0] != b[0])
    return a[1] < b[1];
    return a[0] > b[0];
    }

    sort(nums.begin(), nums.end(), cmp);

以上加粗的也是比较常用的, 其实也很简单啦, 不用很复杂的操作.

个人收获

这些方法对比pythonlist来学其实很简单, 只不过换了一个函数名而已, 当然还是有很多操作不一样, 比如指针操作, 记住就好了, 积少成多, 熟能生巧!

------ 本文结束------