最详细整理STL之vector基础

前言:

Vector是一种可以存储任意类型的动态数组,属于序列式容器,可以用sort对其进行排序,底层数据结构是数组,可以随机访问元素。Vectors 包含着一系列连续存储的元素,其行为和数组类似。访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线性时间复杂度。

注:如果要使用vector,则需要添加vector头文件,即#include<vector>,除此之外,还需要添加using namespace std;

vector的定义

C++中构造vector可以使用以下任意一种参数方式:

语法:

1.vector();

2.vector(size_type num, const TYPE &val);

3.vector(const vector &from);

4.vector(input_iterator start, input_iterator end);

1·无参数 - 构造一个空的vector

2·数量(num)和值(val) - 构造一个初始放入num个值为val的元素的Vector

3·vector(from) - 构造一个与vector from 相同的vector

4·迭代器(start)和迭代器(end) - 构造一个初始值为[start,end)区间元素的Vector(注:半开区间)

举例,假如构造一个包含3个值为4的vector

vector<int> v1(3,4);

访问vector容器内元素的方法

1.通过下标访问

和访问普通的数组是一样的,对一个定义为vector<typename> v的vector容器,直接使用v[index]访问即可,其中index∈[0,v.size()−1]

2.通过迭代器访问

迭代器可以理解为一种类似指针的东西

vector<typename>::iterator it;定义迭代器,得到了迭代器it之后,可以通过*it来访问vector中的元素

3.v[i]和*(v.begin()+i)是等价的

4.迭代器来实现了两种自加操作和自减操作

5.begin()函数的作为是为取v的首元素地址,end()函数并不是为了取v的尾元素地址,而是取尾元素地址的下一个地址。它作为迭代器末尾标志,不储存任何元素

6.在常用STL容器中,只有在vector和string中,才允许使用v.begin()+3这种迭代器加上整数的写法

vector常用函数

vector常用函数的时间复杂度:

push_back(),时间复杂度为O(1)

pop_back(),时间复杂度为O(1)

size(),时间复杂度为O(1)

clear(),时间复杂度为O(N)

insert(),时间复杂度为O(N)

erase(),时间复杂度为O(N)

vector常用函数解读:

push_back(x)就是在vector后面添加一个元素x

pop_back()用于删除vector的尾元素

size()用来获得vector中元素的个数,返回的是unsigned类型,不过一般来说用%d不会出很大问题,这一点对所有STL容器都是一样的

clear()用来清空vector中的所有元素

insert(it,x)用来向vector的任意迭代器it处插入一个元素x

erase():

        删除单个元素,erase(it)即删除迭代器为it处的元素。

        删除一个区间内的所有元素,erase(first,last)即删除[first,last)内的所有元素

        清空vector也可以使用v.erase(v.begin(),v.end());

其他相关函数:

部分函数用法示例:

此处给出一个 vector 示例代码,内容如下:

#include <vector>

#include <iostream>

using namespace std;

int main()

{

    typedef vector<int> vecInt;

    vecInt vecint;

    // 添加数据

    for (int i = 0; i < 5; i++)

    {

        vecint.push_back(i+1);

    }

    // 遍历元素

    vecInt::iterator it;

    cout << "vecint is: " << endl;

    for (it = vecint.begin(); it != vecint.end(); it++)

    {

        cout << *it << endl;

    }

    // 查询数据

    cout << "the second element is: " << vecint.at(1) << endl;

    // 删除数据,删除最后一个元素

    it = vecint.end();

    it = it - 1;                // 需要注意,(it - 1)对应最后一个元素

    vecint.erase(it);

    // 再次遍历元素,观察删除操作是否成功

    cout << "after del, vecint is: " << endl;

    for (it = vecint.begin(); it != vecint.end(); it++)

    {

        cout << *it << endl;

    }

    // 插入数据,在最后一个元素之前插入数据

    it = vecint.end();

    it = it - 1;

    vecint.insert(it, 100);

   

    // 再次遍历元素,观察插入操作是否成功

    cout << "after insert, vecint is: " << endl;

    for (it = vecint.begin(); it != vecint.end(); it++)

    {

        cout << *it << endl;

    }

   

    return 0;

}

上述代码的运行结果如下:


 

vector的高级用法

动态数组不仅仅可以储存基本的数据类型,还能储存自定义数据类型,比如结构体。

struct Student {

string name; // 名字

int age; // 年龄

};

int main() {

    vector<Student> class1; // 班级

    Student stu1, stu2;// 学生1,学生2

    stu1.name = "luobo";

    stu1.age = 12;

    stu2.name = "xiaoming";

    stu2.age = 25;

    class1.push_back(stu1);

    class1.push_back(stu2);

    return 0;

}

可以通常下面的方式使用vector定义二维数组:

vector<vector<int>> vecvec = {{1, 2, 8}, {2, 4, 9}, {4, 7, 10}, {6, 8, 11}};

其实,我们可以通过一个构造函数快速构建这样的一个动态数组,用构造函数的写法和用循环是等价的,通过合理地使用构造函数,可以减少代码量。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萝卜说菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值