理论STL——vector篇(小Z 著)

目录

课前唠一唠

学习过程

vector的定义

方法

vector的访问

vector的常用函数

小结


课前唠一唠

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

学习过程

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

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

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

vector的定义

方法

vector<typename> name;

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

vector<int> a;
vector<double> score;
vector<node> stu;//node为已经定义了的结构体

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

vector<vector<int> > a;

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

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

vector的访问

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

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

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

vector<typename>::iterator it;

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

vector<int>::iterator it;

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

vector<int>::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<int>::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”。

vector<int> v;
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”。

vector<int> v;
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”。

vector<int> v;
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”。

vector<int> v;
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”。

vector<int> v;
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:给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!

  • 33
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 33
    评论
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值