C++ STL——vector
C++ STL——vector
vector简介:
- 1、字义:向量
- 2、实义:变长数组(长度不一定的数组)——vector可以根据下标访问元素,但是它作为容器更像是链表
- 3、意义:vector可以避免普通数组(定长数组)超出内存的情况,可以根据需要改变自身长度
- 4、(看不懂)应用:vector可以用来以邻接表的方式储存图,这对无法使用邻接矩阵的题目(结点数太多)、又害怕使用指针实现邻接表的人是非常友好的,写法也非常简洁
vector使用规范:
- 1、必须添加头文件
#include<vector>之后才能使用 - 2、要添加
using namespace std;
vector用法:
(一)vector的定义
-
1、定义:
vector<typename> name;——就是定义了一个一维变长typename型数组;typename可以是int,double,char,结构体等,也可以是STL标准容器:vector,set,queue等 -
ps:如果typename也是一个STL容器,定义的时候要在>>符号中加入空格,避免C++11之前的编译器将>>认为是移位操作。 -
//eg1: vector<int> name1; vector<double> name2; vector<char> nmae3; vector<node> name;//node是结构体的类型 //eg2: vector<vector<int> > name;//>>之间要加空格 -
2、vector如何引入二维数组:


总结:理解起来,不论是哪一种二维数组的写法(二维vector、vector数组),都认为第一个出现的是第一维且纵向排列。第二维是其横向拓展。
(二)vector容器内元素的访问——vector一般有两种访问方式:
- 通过下标访问方式
- 通过迭代器访问
-
1、通过下标访问:
同普通数组:
arr1[3]=2 //即是将vector容器arr1中下标为3的元素赋值为2 -
2、通过迭代器访问:
迭代器——
iterator可以理解为指针,它的定义是vector<typename>::iterator it;这样就得到了迭代器
it,并且可以通过*it来访问vector里的元素
(三)vector的常见用途
- 1、存储数据:作为数组使用,特别是长度不确定时
- 2、用邻接表存储图
C++ STL——vector代码实操
//代码块————定义vector
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);//push_back(i)在vi的末尾添加元素i,即依次添加1 2 3 4 5
}
//代码1:访问元素————通过下标或者迭代器
#include<stdio.h>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);//i的值跟位置无关,仅仅代表元素的值
}
//vi.begin()为取vi的首元素地址,而it指向这个地址
vector<int>::iterator it=vi.begin();
for(int i=0;i<5;i++){
printf("%d ",*(it+i));//输出vi[i]
}
return 0;
}
/**********笔记**********/
/*
* 1、思考:vi[i]和*(vi.begin()+i)是等价的吗?
* *******************************是的
* vi.begin()是取vi的首元素地址,加*是为了取该地址对应的值
* 因此vi[i]是第i个元素的值(i可为0),vi.begin()同理
* 因此两者一模一样,没有区别
*
* 2、vi.end()的特殊性————不是vi的最后一个元素的地址
* 老美喜欢左闭右开,因此vi.end()是指最后一个元素下一个的地址
* 该地址不储存任何元素
**/
/**********笔记**********/
//代码2:访问元素————it的自加[it++ or ++it]
#include<stdio.h>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);
}
//vector的迭代器不支持it < vi.end()的写法,因此循环条件只能写成it!=vi.end()
for(vector<int>::iterator it=vi.begin();it!=vi.end();it++){//在常用STL容器中,只有在vector和string中,才允许vi.begin()+3这种迭代器加上整数的做法
printf("%d ",*it);
}
return 0;
}
//代码3:vector常用函数————尾查元素函数:push_back()-----O(1)
#include<stdio.h>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=3;i++){
vi.push_back(i);//将i依次推进数组中
}
for(int i=0;i<vi.size();i++){
printf("%d",vi[i]);
}
return 0;
}
//代码4:vector常用函数————尾删元素函数:pop_back()-----O(1)
#include<stdio.h>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=3;i++){
vi.push_back(i);
}
vi.pop_back();//删除vi的尾元素
for(int i=0;i<vi.size();i++){
printf("%d",vi[i]);
}
return 0;
}
//代码5:vector常用函数————元素个数函数:size()-----O(1)
//size()返回值是unsigned类型的,用%d问题不大————这一点对于所有的STL容器都是一样的
#include<stdio.h>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=3;i++){
vi.push_back(i);
}
printf("%d\n",vi.size());
return 0;
}
//代码6:vector常用函数————清空函数:clear()-----O(n)
#include<stdio.h>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=3;i++){
vi.push_back(i);
}
vi.clear();
printf("%d\n",vi.size());
return 0;
}
//代码7:vector常用函数————插入函数:insert()-----O(n)
//insert(it,x)是用来向任意迭代器it处插入一个元素x
#include<stdio.h>
#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()+2,-1);
for(int i=0;i<vi.size();i++){
// printf("%d ",vi[i]);
printf("%d ",*(vi.begin()+i));
}
return 0;
}
//代码8:vector常用函数————擦除函数:erase()-----O(n)
//擦除函数的作用是擦除一个区间的元素,这个区间的长度至少为1
#include<stdio.h>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=5;i<=10;i++){
vi.push_back(i);
}printf("输出最初序列:");
for(int i=0;i<vi.size();i++){
printf("%d ",vi[i]);
}
printf("\n");
vi.erase(vi.begin()+5);
printf("输出没有10的序列:");
for(int i=0;i<vi.size();i++){
printf("%d ",vi[i]);
}
printf("\n");
vi.erase(vi.begin()+1,vi.begin()+4);
printf("删除5到9之间元素之后的序列:");
for(int i=0;i<vi.size();i++){
printf("%d ",vi[i]);
}
return 0;
}

浙公网安备 33010602011771号