0
点赞
收藏
分享

微信扫一扫

算法笔记6.1 vector 常见用法


vector:向量 
            变长数组
(其实为了实现变长,代价是很大的)  vector本质上就是数据结构里基于数组的线性表
            节省内存
            以邻接表的方式存储图

1.vector的定义

vector<typename> name;
eg:
    vector<int> name;
    vector<node> name;   //node是结构体类型
    vector<vector<int> > name; //注意>>直接要用空格 > > 否则有些编译器会误认为是移位
    vector<int> vi[100];
    最后两个都是vectors数组 但是最后一个二维数组只有其中一维是变长的
    
2.vector容器内元素的访问
(1)通过下标访问
    vector<int> vi;
    访问:vi[index]  vi[0] vi[1]
        index范围:0~vi.size()-1

(2)通过迭代器访问
    迭代器是一个类似指针的东西
    vector<int>::iterator it;

代码1:

#include<iostream>     
#include <vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);//尾部分别插入1 2 3 4 5
}
//下标输出
cout<<"下标输出:";
for(int i=0;i<5;i++){
cout<<vi[i]<<" ";
}

//iterator迭代器输出
vector<int>::iterator it=vi.begin();//初始化为begin
cout<<"\n迭代器输出:";
for(int i=0;i<5;i++){
cout<<*(it+i)<<" ";
}
cout<<endl;
return 0;
}

算法笔记6.1 vector 常见用法_#include

 

  1. vi[i]和*(vi.begin()+i)是等价的
  2. vi.begin()首地址,vi.end()最后一个元素的下一个地址 (美国人习惯左闭右开)
  3. 迭代器支持自加和自减操作,it++,++it,it--,--it

代码2:

#include<iostream>     
#include <vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);//尾部分别插入1 2 3 4 5
}

//iterator迭代器输出
//vector的迭代器不支持it<vi.end()的写法,因此循环条件只能用it!=vi.end()
for(vector<int>::iterator it=vi.begin();it!=vi.end();it++){
cout<<*it<<" ";
}
cout<<endl;
return 0;
}

算法笔记6.1 vector 常见用法_vector_02

 

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

 

3.vector常用函数实例解析

(1)push_back()

push_back(x)在vector后面添加一个元素x,时间复杂度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);
}
//输出
for(int i=0;i<vi.size();i++){
cout<<vi[i]<<" ";
}
cout<<endl;
return 0;
}

算法笔记6.1 vector 常见用法_vector_03

 

(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();//删除尾元素
for(int i=0;i<vi.size();i++){
cout<<vi[i]<<" ";
}
cout<<endl;
return 0;
}

算法笔记6.1 vector 常见用法_ios_04

 

(3)size()

获得vector中元素个数,时间复杂度O(1) 类型unsigned  %d输出也没问题

#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);
}
cout<<vi.size()<<endl;
vi.pop_back();
cout<<vi.size()<<endl;
return 0;
}

算法笔记6.1 vector 常见用法_i++_05

 

(4)clear()

clear()用来清空vector中的所有元素,时间复杂度O(N),N为vector中元素的个数

#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);
}
cout<<vi.size()<<endl;
vi.clear();
cout<<vi.size()<<endl;
return 0;
}

算法笔记6.1 vector 常见用法_ios_06

 

(5)insert()

insert(it,x),在vector任意迭代器it处插入一个元素x,后面的元素全部自动向后移一位,可以理解为在it左边插入一个元素,时间复杂度为O(N)   //vector就是数组结构里基于数组的线性表

#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()+2,-1);
for(int i=0;i<vi.size();i++){
cout<<vi[i]<<" ";
}
cout<<endl;
return 0;
}

算法笔记6.1 vector 常见用法_STL_07

 

(6)erase()

删除单个元素或者删除一个区间内所有的元素

①删除单个元素 erase(it)

#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=5;i<=9;i++){
vi.push_back(i);//5 6 7 8 9
}
vi.erase(vi.begin()+3);//删除8
for(int i=0;i<vi.size();i++){
cout<<vi[i]<<" ";
}
cout<<endl;
return 0;
}

算法笔记6.1 vector 常见用法_vector_08

 

②删除一个区间内所有元素

erase(first,last) 删除[first,last)内的所有元素   //美国人还是喜欢左闭右开

#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=5;i<=9;i++){
vi.push_back(i);//5 6 7 8 9
}
vi.erase(vi.begin()+1,vi.begin()+4);//删除 6 7 8
for(int i=0;i<vi.size();i++){
cout<<vi[i]<<" ";
}
cout<<endl;
return 0;
}

算法笔记6.1 vector 常见用法_vector_09

 

4.vector常见用途

(1)储存数据

①节省空间

②避免一行末尾输出多余空格(暂时不知道如何处理)

(2)用邻接表存储图

vector存储图,避免了复杂的指针操作

 

 

5.vector重载了==运算符

判等逻辑为元素个数和顺序完全相同

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;

void printV(vector<int> vi){
for(int i=0;i<vi.size();i++){
cout<<vi[i]<<" ";
}
cout<<endl;
}

void compareV(vector<int> vi1,vector<int> vi2){
if(vi1==vi2){
cout<<"相等:vi1==vi2"<<endl;
}else{
cout<<"不等:vi1!=vi2"<<endl;
}
}

int main(){
vector<int> vi1,vi2;
int a[5]={1,3,4,2,5};
int b[5]={1,3,4,2,5};
for(int i=0;i<5;i++) vi1.push_back(a[i]);
for(int i=0;i<5;i++) vi2.push_back(b[i]);
cout<<"vi1:";printV(vi1);
cout<<"vi2:";printV(vi2);
compareV(vi1,vi2);
cout<<endl;

vi1.pop_back();
cout<<"vi1:";printV(vi1);
cout<<"vi2:";printV(vi2);
compareV(vi1,vi2);
cout<<endl;

vi1.push_back(5);vi1.push_back(10);vi1.push_back(9);
vi2.push_back(9);vi2.push_back(10);
cout<<"vi1:";printV(vi1);
cout<<"vi2:";printV(vi2);
compareV(vi1,vi2);//顺序必须完全相同
cout<<endl;

return 0;
}

算法笔记6.1 vector 常见用法_i++_10

 

6.vector重载了= 可以直接赋值

#include <stdio.h>
#include<iostream>
#include<vector>
using namespace std;

int main(){
vector<int> vi1;
vector<int> vi2;
vi1.push_back(1);
vi1.push_back(2);
vi1.push_back(3);
vi2=vi1;//vector可以直接赋值
for(int i=0;i<vi2.size();i++){
cout<<vi2[i]<<" ";
}
cout<<endl;
return 0;
}

算法笔记6.1 vector 常见用法_ios_11

 

举报

相关推荐

0 条评论