C++标准模板库之vector

  1. 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是结构体的类型

如果typenamevector,则这样定义:

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实现邻接表

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值