- vector的常见用法详解
容器->vector 翻译为向量,但是这里是我们称它为“长度根据需要而自动改变的数组”。在编程过程中只用到普通数组有时会出现超内存的情况,这种情况使用vector 会让问题的解决简单很多。如果使用vector,则需要添加相对应的头文件即:#include<vector>
。除此之外,还需要加上using namesapce std;
.
2.vector 的定义:
单独定义一个 vector 格式:
vector<typename> name;
/*这里的typename 可以是任意基本类型,例如int,double,char
结构体等,也可以是STL标准容器,例如vector,set,queque等。
注意:定义的时候记得在>>符号之间加上空格。
*/
简单例子:
vector<int> name;
vector<double> name;
vector<char> name;
vector<node> name;//node是结构体的类型
如果typename
是vector
,则这样定义:
vector<vector<int>> name;
/*
可以把vector数组当做两维都可以根据需要变长的二维数组理解
*/
3.vector容器内元素的访问:
vector
一般访问有两种方式:通过下标访问或通过迭代器访问。下面讨论这两种访问方式。
(1) 通过下标访问
和普通数组一样,对一个定义的为vector<typename> vi;
的vector
容器来说,直接访问vi[index]
即可(如vi[0]
,vi[1]
)。这里的下标是从0到vi.size()-1
,访问这个范围以外的元素可能会出错。
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);
}
for(int i=0;i<=vi.size()-1;i++){
printf("%d ",vi[i]);
}
return 0;
}
运行结果:
(2)通过迭代器访问
迭代器(iterator
)可以理解一种类似指针的东西,其定义是:
vector<typename>::iteator it;
这样it
就是一个vector<typename>::iteator
类型的变量,并可以通过*it
来访问vector
里的元素。
下面个例子:
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);//这里的push_back(i)在vi的末尾添加元素,
可以通过类似下标和指针访问数组的方式来访问容器内的元素;
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);
}
vector<int>:: iterator it=vi.begin();
//vi.begin()为取vi的首元素地址,it指向这个地址
for(int i=0;i<5;i++){
printf("%d",*(it+i));
}
return 0;
}
运行结果:
3.vector常用函数实例
(1). push_back()
push_back(x)
就是在vector 后面添加一个元素x,时间复杂度为O(1)
具体实例在以上3.(1)中有体现
(2). pop_back()
有添加就有删除,pop_back()
用于删除vector的尾元素,时间复杂度为O(1)。
示例如下:
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);
}
vi.pop_back();//删除尾元素 5
for(vector<int>::iterator it=vi.begin();it!=vi.end();it++){
printf("%d \n",*it);
}
return 0;
}
运行截图:
(3). size()
获取vector
中元素的个数,时间复杂度为O(1),size()
返回的是unsigned
类型,不过一般来说%d
不会有很大问题,这对于STL容器都是一样的。
示例如下:
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);
}
vi.pop_back();
printf("%d",vi.size());
return 0;
}
运行截图:
(4). clear()
clear()
用于清空vector
中所有元素,事件复杂度为O(N),期中N为元素个数。
示例如下:
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);
}
printf("使用clear()之前,元素个数为:%d\n",vi.size());
vi.clear();
printf("使用clear()之后,元素个数为:%d\n",vi.size());
return 0;
}
运行截图:
(5). insert()
insert(x,y)
,用来向vector
的任意迭代器x处插入一个元素y,时间复杂度为O(N)
示例如下:
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);
}
vi.insert(vi.begin()+3,8);//将8插入到vi[3]处
for(int i=0;i<=vi.size()-1;i++){
printf("%d ",vi[i]);
}
return 0;
}
运行解图:
(5). erase()
erase()
有两种用法:删除单个元素,删除一个区间的元素。时间按复杂度为O(N)
a:删除单个元素
erase(it)
删除it处的元素
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);
}
vi.erase(vi.begin()+3);
//删除vi[4]的元素
for(int i=0;i<=vi.size()-1;i++){
printf("%d ",vi[i]);
}
return 0;
}
运行截图:
b:删除一个区间内的元素。
格式:erase(firse,last)
删除[first,last)区间内的所有元素:
示例如下:
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=5;i<=10;i++){
vi.push_back(i);
}
vi.erase(vi.begin()+1,vi.begin()+4);
//删除去区间[2,5)内所有元素
for(int i=0;i<=vi.size()-1;i++){
printf("%d ",vi[i]);
}
return 0;
}
运行截图:
如果清空所有元素可以使用vi.earse(vi.begin(),vi.end)
,但使用vi.clear()
清空vector更方便。
4.vector的常见用途
(1) 存储数据
-vector本身可以作为数组使用,而且在一些元素个数不确定的场合可以很好地节省空间。
-有些场合需要更具一些条件把部分数据输出在同一行,数据中间用空格隔开。由于输出数据的个数是不确定的,为了更方便地吹最后一个满足条件地数据后面不输出额外的空格,可以先用vector记录所有需要输出的数据,然后一次性输出。
(2) 用邻接表存储图
-使用vector实现邻接表