STL(标准模板库)(暂不包含queue、priority_queue、stack)

平时会遇到只用普通数组会超内存的情况,这时用vector会简便许多

使用vector要加的头文件

#include<vector>

using namespace std;

1、vector的定义

vector<typename>name; 

此定义相当于一堆数组name[SIZE],只不过其长度可以根据需要进行变化,比较节省空间

即“变长数组”

此处的typename与一维数组一样,可以是任何基本类型,如int、double、char、结构体等

也可以是STL标准容器,例如vector、set、queue等

需要注意的是,如果typename也是一个STL容器

定义的时候要记得在>>符号之间加上空格

因为一些使用C++11之前标准的编译器会把它视为移位操作

 vector<vector<int>> name; //加空格

联想到二维数组的定义,即其中一维是一个数组的数组

同理,vector数组,即Arrayname[]中的每一个元素都是一个vector

vector<typename> Arrayname[arraySize]; 
   vector<int> vi[100];

这样Arrayname[0]~Arrayname[arraySize-1]中的每一个都是vecto容器

与vector<vector<int>> name不同的是,这种写法的一维长度已经固定为arraySize

另一维才是“变长”的

2、vector容器内元素的访问

(1)通过下标访问

与访问普通数组是一样的,如定义vector<typename> vi的vector容器来说

直接访问vi[index]即可

下标范围是0到vi.size()-1

(2)通过迭代器访问

迭代器iterator可以理解为一种类似指针的东西

定义是

vector<typename>::iterator it;

it就是一个vector<typename>::iterator型的变量

可以通过*it来访问vector里的元素

 vector<int> vi;
   for(int i=1;i<=5;i++)
   {
       vi.push_back(i);//push_back(i)在vi的末位依次添加1、2……
   }

可以通过类似下标和指针访问数组的方式来访问容器内的元素

#include <bits/stdc++.h>
using namespace std;
int main()
{
   vector<int> vi;
   for(int i=1;i<=5;i++)
   {
       vi.push_back(i);//push_back(i)在vi的末位依次添加1、2
   }
   vector<int>::iterator it=vi.begin();
   for(int i=0;i<5;i++)
   {
       printf("%d ",*(it+i));
   }
   return 0;
}

可以看出vi[i]和*(vi.begin()+i)是等价的

begin()函数的作用是取vi的首元素地址

end()并不是取vi的尾元素地址,而是取尾元素地址的下一个地址

左闭右开

end()作为迭代器末尾标志,不存储任何元素

同时,迭代器还实现了两种自加操作++it与it++

#include <bits/stdc++.h>
using namespace std;
int main()
{
   vector<int> vi;
   for(int i=1;i<=5;i++)
   {
       vi.push_back(i);//push_back(i)在vi的末位依次添加1、2
   }
   for(vector<int>::iterator it=vi.begin();it!=vi.end();it++)
   {
       printf("%d ",*it);
   }
   return 0;
}

【注意】

在常用的STL容器中,只有vector和string中,才允许使用vi.begin()+3这种迭代器加上整数的用法

3、vector常用函数

①push_back()

push_back(x)就是在vector后面添加一个元素x

#include <bits/stdc++.h>
using namespace std;
int main()
{
   vector<int> vi;
   for(int i=1;i<=3;i++)
   {
       vi.push_back(i);//push_back(i)在vi的末位依次添加1、2
   }
   for(int i=0;i<vi.size();i++)//size()函数会给出vi中元素的个数
   {
       printf("%d ",vi[i]);
   }
   return 0;
}

②pop_back()

用以删除vector的尾元素

③size()

用来获得vector中元素的个数

返回的是unsigned类型

用%d也不会出很大问题

④clear()

清空vector中的所有元素

⑤insert()

insert(it,x)用来向vector的任意迭代器it处插入一个元素x

#include <bits/stdc++.h>
using namespace std;
int main()
{
   vector<int> vi;
   for(int i=1;i<=3;i++)
   {
       vi.push_back(i);//push_back(i)在vi的末位依次添加1、2
   }
   vi.insert(vi.begin()+2,-1);
   for(int i=0;i<vi.size();i++)//size()函数会给出vi中元素的个数
   {
       printf("%d ",vi[i]);
   }
   return 0;
}

⑥erase()

(1)删除单个元素

erase(it)即删除迭代器为it处的元素

vi.erase(vi.begin()+3);

vi[3]

(2)删除一个区间内的所有元素

vi.erase(vi.begin()+1,vi.begin()+4);

左闭右开

[vi[1],vi[4])

4、vector的常见用途

①储存元素

(1)vector本身可以作为数组使用,而且在一些元素个数不确定的场合可以很好地节省空间

(2)有些场合需要根据一些条件把部分数据输出在同一行,数据中间用空格隔开

由于输出数据的个数是不确定的,为了更方便地处理最后一个满足条件的数据后面不输出额外的空格

可以先用vector记录所有需要输出的数据,最后一次性输出

②用邻接表存储图

知识点来自于《算法笔记》

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值