c++中vector的由来与用法

引言:

最近做题的时候发现vector出现的挺多,课本上有讲过vector,但是为什么会有vector,它的优势又是什么,查阅资料后,写下此篇

很多人都知道vector是一个不用再初始化就必须制定大小的边长数组,但是为什么c++需要vector这样一个容器呢?


在了解vector之前,我们先来了解一下STL。

STL是什么

STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能。

STL 是 C++ 标准库的一部分,不用单独安装(可能这也是它能广泛流行的原因之一吧)。我们在写程序的时候,STL就是在我们引入的各个头文件中,以源码的形式存在。

从根本上说,STL 是一些容器、算法和其他一些组件的集合,所有容器算法都是总结了几十年来算法和数据结构的研究成果,汇集了许多计算机专家学者经验的基础上实现的,它借助模板把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。因此可以说,STL 基本上达到了各种存储方法和相关算法的高度优化。

这里提到的容器,本质上就是封装有数据结构的模板类。vector就是STL中的容器之一。

为什么会出现STL

人的天性本就是懒惰的,都想通过最小的努力获取最大的回报,而STL就是由于这种懒惰应运而生。

举个例子来说明一下:

问题:如果我们想创建一个数组,但又不确定它的长度,那么我们可以在堆中申请一个动态数组

int*a=new int[n];

这样的数组大小取决于变量n,但是如果出现空间不足的情况,我们需要扩大空间为m时,则需要这几步

int*b=new int[m];//搞一个更大的数组
memecpy(b, a, sizeof(int)*n);//把a的数据拷贝到b中
delete[]a;//释放a所指空间
a=b;//a也指向b了

而完成相同的操作,如果采用 STL 标准库中的vector,只用一行代码,且不会出现空间不够的情况

vector<int>a//数组a当前的长度为0,但它可以根据存储数据的数量自动变长,就像一个气球

由上述例子明显可以看出,使用STL中的部件可以明显简化代码的复杂程度。这其实是因为STL屏蔽了众多细节,使得我们可以集中精力去实现程序的功能,无需再纠结某些细节如何用代码实现。

因此,如果你是一个懒人,非常建议去多用STL中的零件


接下来来了解下vector

vector是什么

vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

vector在C++中的用法

头文件

#include<vector>

功能函数

vector<int>c

(1)c.assign(beg,end) c.assign(n,elem)

将(beg; end)区间中的数据赋值给c。将n个elem的拷贝赋值给c。

传回索引idx所指的数据,如果idx越界,抛出out_of_range

(2)c.back()

传回最后一个数据,不检查这个数据是否存在。

(3)c.begin()

传回迭代器中的第一个数据地址。

(4)c.capacity()

返回容器当前已分配的容量。

(5)c.clear()

移除容器中所有数据。

(6)c.empty()

判断容器是否为空。

c.end() //指向迭代器中末端元素的下一个,指向一个不存在元素。

c.erase(pos)// 删除pos位置的数据,传回下一个数据的位置。

c.erase(beg,end)

删除[beg,end)区间的数据,传回下一个数据的位置。

(7)c.front()

传回第一个数据。

(8)get_allocator

使用构造函数返回一个拷贝。

c.insert(c.begin()+pos,elem)//在pos位置插入一个elem拷贝,传回新数据位置

c.insert(c.begin()+pos,n,elem)//在pos位置插入n个elem数据,无返回值

c.insert(c.begin()+pos,beg,end)//在pos位置插入在[beg,end)区间的数据。无返回值

(9)c.max_size()

返回容器中最大数据的数量。

(10)c.pop_back()

删除最后一个数据。

c.push_back(elem)

在尾部加入一个数据。

(11)c.rbegin()

传回一个逆向队列的第一个数据。

(12)c.rend()

传回一个逆向队列的最后一个数据的下一个位置。

(13)c.resize(num)

重新指定队列的长度。

(14)c.reserve()

保留适当的容量。

(15)c.size()

返回容器中实际数据的个数。

函数众多,但如果自己不用永远也不会熟练,众多懒人同胞们,多试试吧!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

七七喝椰奶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值