引言:
最近做题的时候发现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()
返回容器中实际数据的个数。
函数众多,但如果自己不用永远也不会熟练,众多懒人同胞们,多试试吧!