STL学习笔记(变长数组vector)

1.变长数组vector

概念

vector译为向量,一般来说也叫变长数组,也就是长度可以任意变化的数组,有些题目需要开很多数组,往往造成内存超限,使用vector简单方便,还可节省空间。

头文件

头文件,需要用using namespace std;。

定义方式

vector<type_name> name;
其中type_name可以是任何数据类型,如int,double,char,string,结构体,vector等
例:

vector<int> a;                 //定义了一个整型不定长数组a     
vector<double> score;   //定义了一个双精度浮点型不定长数组score
vector<node> stu;          //定义了一个结构体类型的不定长数组stu
注意事项

如果type_name也是一个STL的容器,那么定义时需要在两个“>”符号之间加一个空格,不然编译器会误认为是位运算的右移符号“<<”,例如:

vector<vector<int> > a;  //定义了一个两个维度都可变的二维整型数组a,两个“>”间有一个空格 
vector的访问

访问vector中的元素一般有两种方式:下标访问 和 **迭代器(iterator)**访问。
下标访问:对于vector<type_name> vec,可以用vec[index]来访问,其中,0≤index≤vec.size() – 1,vec.size()表示vector中元素的个数。
迭代器访问:对于vector<type_name> vec,可以设一个vector<type_name>::iterator it来访问,这个it就是一个迭代器,可以通过“*it”来访问该容器里的元素值。
举个栗子:

vector<int>::iterator it = v.begin()//定义一个迭代器it,初始化为容器v的首元素地址,这是*it相当于v[0],*(it + i)相当于v[i]。

迭代器还可以进行自加自减操作,如it++,++it,it–,--it,注意:迭代器不支持“it<v.end()”的写法,只能是“it != v.end()”, v.end()并不是取v容器尾元素地址,而是尾元素下一个地址。
例:

for(vector<int>::iterator it = v.begin(); it != v.end(); it ++) printf(%d”,*it);

常用函数

push_back()

解释:push_back(x)将x添加到容器最后,时间复杂度为O(1)。

size()

解释:如果是一维数组,size()用来获得vector中元素个数;如果是二维数组,size()用来获得vector中第二维的元素个数,时间复杂度为O(1)。

pop_back()

解释:用来删除vector中的尾元素。时间复杂度为O(1)

clear()

解释:用来清空vector中的所有元素。时间复杂度为O(n)

insert()

解释:insert(it, x)用来向vector任意迭代器it处插入元素x。时间复杂度为O(n)。
例:

vector<int> v;
for(int i = 1;i <= 5;i ++)
v.push_back(i)
vector<int>::iterator it = v.begin();
v.insert(it + 2,-1);
for(;it != v.end();it ++)
printf("%d ",*it);
//以上代码会输出1,2,-1,3,4,5
erase()

解释:erase()用来删除vector中的元素,有两种用法,一是erase(it),删除迭代器it处的单个元素;二是erase(first, last),删除左开右闭区间[first, last)内的所有元素。
例如:

vector<int> v;
for(int i = 1;i <= 5;i ++)
v.push_back(i);
vector<int>::iterator it = v.begin();
v.erase(it + 1);
v.erase(it + 2,it  + 4)for(int i = 0;i < v.size();i ++)
printf("%d",v[i]);
//以上代码会输出1,3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值