理论STL——vector篇(小Z著)-创新互联

目录

你所需要的网站建设服务,我们均能行业靠前的水平为你提供.标准是产品质量的保证,主要从事成都做网站、成都网站制作、企业网站建设、成都手机网站制作、网页设计、品牌网站制作、网页制作、做网站、建网站。创新互联拥有实力坚强的技术研发团队及素养的视觉设计专才。

课前唠一唠

学习过程

vector的定义

方法

vector的访问

vector的常用函数

小结


课前唠一唠

OK,大家好,我又来啦,那么这期讲一下C++的一个知识点——vector……

学习过程

C++功能强大,为开发者提供了标准模板库(standard template library,STL),其中封装了很多实用的容器。容器可以理解成能够实现很多功能的系统函数,或者说是一种用来存放数据的对象,开发者可以根据接口规范(调用格式)直接调用,而不用关心其内部实现的原理和具体代码,十分方便快捷。常见的容器有vector,stack,queue,map,set等……

vector直接翻译为“向量”,一般说成“变长数组”,也即“长度根据需要而自动改变的数组”。在信息学竞赛中,有些题目需要定义很大的数组,这样会出现“超出内存限制”的错误。比如,如果一个图的顶点太多,使用邻接矩阵就会超出内存限制,使用指针实现邻接表又很容易出错,而使用vector实现简洁方便,还可以节省存储空间。

使用vector,首先需要添加vector头文件,即include,同时,必须要有“using namespace std”。

vector的定义 方法
vectorname;

以上定义相当于定义了一个一维数组name[size],只是size不确定,其长度可以根据需要而变化。其中,typename可以是任何基本类型,如int,double,char,结构体等,也可以是STL标准容器,如vector,queue等。例如:

vectora;
vectorscore;
vectorstu;//node为已经定义了的结构体

但是,如果typename也是一个STL容器,那么定义时需要在两个“>”的符号之间加上一个空格,因为“>>”在C++11标准之前的编译器里会作为“移位”操作,从而导致编译错误。例如:

vector>a;

这个格式很容易让人想起二维数组的定义,即一个一维数组的每一个元素又是一个一维数组。对于多维数组,vector操作的核心思想就是“高维向低维转化”。例如:

vectorv[100];//定义一个一维长度已经固定为100的二维数组,另外一维长度不固定
vector>a;//定义一个两个维度长度都可变的二维数组
vector的访问

访问vector中的元素一般有两种方式。

第一种是通过“下标”访问。例如,对于容器vectorv,可以使用v[index]来访问它的第index个元素。其中,0<=index<=v.size()-1.size()表示vector中元素的个数。

第二种方式是通过“迭代器”访问。可以将迭代器(iterator)理解为一种类似指针的变量。其定义为:

vector::iterator it;

这样,it就是一个vector::iterator型的变量。例如:

vector::iterator it;

就是定义一个迭代器it,并且通过“*it”来访问int类型的vector里的元素。例如:

vector::iterator it= v.begin();//v.begin()为取v的首元素地址,而it指向这个地址,相当于v[0]。v[i]和*(v.begin()+i)是等价的
for(int i=0;i<=5;i++) printf("%d",*(it+i));//输出v[i]

在常用的STL容器中,只有vector和string允许使用“v.begin()+3”这种迭代器加上整数的写法。同时,迭代器也可以进行自加,自减操作,即it++,++it,it--和--it。例如:

for(vector::iterator it = v.begin();it!=v.end();it++)
    printf("%d",*it);//输出v[i]

需要注意的是:v.end()并不是取v的尾元素地址,而是尾元素地址的下一个地址,作为迭代器末尾标志不存储任何元素。

vector的常用函数

前面已经介绍了两个vector函数:begin()和end()。需要注意的是,这是一种“左闭右开”的表示方法。下面介绍其他几个常用的vector函数。

(1)push_back():push_back(x)用来在vector后面添加一个元素x,时间复杂度为0(1)。

(2)size():如果是一维数组,size()用来获得vector中元素的个数;如果是二维数组,size()用来获得vector中第二维的元素个数,时间复杂度为0(1)。同时,还可以使用resize(n)重设数组的大小。例如,以下一段代码输出“12300”。

vectorv;
for(int i = 1;i<= 3;i++) v.push_back(i);
v.resize(5);
for(int i = 0;i< v.size;i++) printf("%d",v[i]);

(3)pop_back():pop_back()用来删除vector的尾元素,时间复杂度为0(1)。例如,以下代码段输出“12”。

vectorv;
for(int i = 1;i<= 3;i++) v.puch_back(i);
v.pop_back();
for(int i = 0;i< v.size();i++) printf("%d",v[i]);

(4)clear():clear()用来清空vector中的所有元素,时间复杂度为0(n),其中n为vector中元素的个数。例如,以下一段代码输出“0”。

vectorv;
for(int i = 1;i<= 3;i++) v.push_back(i);
v.clear();
printf("%d",v.size());

(5)insert():insert(it,x)用来向vector任意迭代器it处插入一个元素x,时间复杂度为0(n)。例如,以下一段代码输出“1 2 -1 3 4 5”。

vectorv;
for(int i = 1;i<= 5;i++) v.push_back(i);
v.insert(v.begin()+2,-1);//将-1插入到v[2]处
for(int i = 0;i< v.size();i++)printf("%d",v[i]);

(6)erase():erase()用来删除vector中的元素,有两种方法。一种是erase(it),删除迭代器it处的元素;另一种是erase(first,last),删除左闭右开区间[first,last)内的所有元素。例如,以下一段代码输出“1 5”。

vectorv;
for(int i = 1;i<= 5;i++) v.push_back(i);
v.erase(v.begin()+1,v.begin()+4);//删除v[1],v[2],v[3]
for(int i = 0;i< v.size();i++)printf("%d",v[i]);
小结

这节课大家都听你懂了吗?(博主写了一天了,累死了,求求给一个赞吧,谢谢了),听懂了的话记得三连交一下学费,那么这期就到此为止了,我们下期再见,拜拜┏(^0^)┛!!!

PS:给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站栏目:理论STL——vector篇(小Z著)-创新互联
浏览地址:http://pwwzsj.com/article/ipcgs.html