一、vector简介
# include <vector>
using namespace std;
常见用途
储存数据。
vector本身可以作为数组使用,并且在一些元素个数不确定的场合可以很好的节省空间 一些场合需要根据一些条件把部分数据输出在同一行,数据中间用空格隔开。由于输出数据的个数是不确定的,为了方便处理最后一个满足条件的数据而不输出额外的空格,可以先用vector记录所有需要处理的数据,如何一次性输出。 用邻接表存储图
二、vector定义
单独定义一个vector,相当于是一维数组name[SIZE],只不过其长度可以根据需要变化,即变长数组。
vector< typename > name;
这里的typename可以是任何基本类型,如int、char、结构特等,也可以是STL标准容器,如vector、set、queue等。 如果typenmae也是一个STL容器,定义的时候要在>>符号之间加上空格,因为一些使用C++11之前的编译器会把它视为移位操作,导致编译错误。 示例
vector< int > name;
vector< char > name;
vector< node> name;
vector< vector< int > > name;
vector< int > Arrayname[ arraySize] ;
三、vector容器内元素的访问
通过下标访问
与普通数组的访问方式一致 下标范围是0~vi.size() - 1 通过迭代器访问
迭代器(iterator)可以理解为一种类似指针的东西 it就是一个vector< typename >::iterator型的变量,其中typename为定义vector时填写的类型
vector< typename > :: iteartor it;
vector< int > :: iterstor it;
# 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 ( ) ;
for ( int i = 0 ; i < 5 ; i++ ) {
printf ( "%d" , * ( it + i) ) ;
}
return 0 ;
}
迭代器遍历向量
begin()函数的作用是取vi的首元素地址 end()函数的作用并不是取尾元素的地址,而是取尾元素的下一个地址。end()作为迭代器末尾标志,不储存任何元素。 类似左闭右开区间 迭代器还实现了两种自加操作++i和i++
# include <vector>
using namespace std;
int main ( ) {
vector< int > vi;
for ( int i = 1 ; i <= 5 ; i++ ) {
vi. push_back ( i) ;
}
for ( vector< int > :: iterator it = vi. begin ( ) ; it != vi. end ( ) ; it++ ) {
printf ( "%d" , * it) ;
}
return 0 ;
}
在常用STL容器中,只有在vector和string中,才允许使用vi.begin() + 3这种迭代器加上整数的写法
四、vector常用函数
push_back():在vector后面添加一个元素x,时间复杂度O(1) pop_back():在vector后面删除一个元素x,时间复杂度O(1) size():获取vector中元素的个数,时间复杂度O(1) clear():用来清空vector中的所有元素,时间复杂度O(n) insert():insert(it,x)用来向vector的任意迭代器it处插入一个元素x,时间复杂度O(n) erase():时间复杂度均为O(n)
删除单个元素:erase(it)即删除迭代器it处的元素 删除一个区间内的所有元素:erase(first, last)即删除[first, last)内的所有元素 示例
# include <stdio.h>
# include <vector>
using namespace std;
int main ( ) {
vector< int > vi;
for ( int i = 1 ; i <= 5 ; i++ ) {
vi. push_back ( i) ;
}
printf ( "%d\n" , vi. size ( ) ) ;
vi. insert ( vi. begin ( ) + 1 , - 1 ) ;
vi. pop_back ( ) ;
vi. erase ( vi. begin ( ) + 1 ) ;
vi. erase ( vi. begin ( ) + 1 , vi. begin ( ) + 3 ) ;
for ( vector< int > :: iterator it= vi. begin ( ) ; it!= vi. end ( ) ; it++ ) {
printf ( "%d\n" , * it) ;
}
vi. clear ( ) ;
printf ( "%d\n" , vi. size ( ) ) ;
return 0 ;
}