STL系列:vector入门
Vctor
大家都知道有些题只开单纯的数组实在太难写了,
所以$STL$是一个非常好的东西;
先介绍一下$vector$:
$vector$可以支持迅速的随机访问,但$vector$一般都在末尾进行删减;
一般代码操作
#include<vector> 头文件,万能头是包含的
vector<int> a; 定义一个$int$型的$vector$
a.push_back(); 在末尾加上一个数
a.pop_back(); 删去末尾一个数
a.clear(); 清空$vector$
a.empty(); 判断$vector$是否为空,如果是返回$true$,否则$false$
a.size(); 返回$vector$的长度
a.capacity() 预分配的内存空间
a.insert(); 任意位置插入元素
a.erase(); 任意位置删除元素
a.insert(a.begin()+i,a); 在第$i+1$个元素前面插入$a$
a.erase(a.begin()+i,a.end()+j); 删除区间$[i,j-1]$,区间从$0$开始
front 返回$vector$的第一个数,示例:$int~b=a.front()$; 等价于$*a.begin()$ 和 $a[0]$
back 返回$vector$的最后一个数,示例:$int~b=a.back()$; 等价于$*--a.end()$ 和 $a[a.size()-1]$
sort (a.begin(), a.end()); $vector$ 内排序(从小到大);
sort (a.begin(), a.end(), greater<int>()); (从大到小);
迭代器
这是基础用法,vector可以用迭代器,这样就减少了访问数组的麻烦
如:
for(int i=0;i<a.size();i++)
cout<<a[i]<<endl;
for(vector<int>::iterator it=a.begin();it!=a.end();it++)
cout<<*it<<endl;
实际上,上面两个for循环是一样的
vector 使用注意事项
1,vector是动态数组,灵活性比较好,不需要考虑长度问题,可以减少编程复杂度,使用起来和数组一样方便。
2,vector的做法是:重新开辟一段新的空间,将原空间的数据迁移过去,然后新加入的数据存放在新空间之后并释放掉原有空间。
3,vector的效率远低于数组,在效率要求较高时慎用。
4,如果需要存放的元素有一个不太大的最大值数量,那么大多数时候使用数组会更加简洁。
因为vector使用起来注意事项太多,即使是熟练的人也很容易出现内存失效之类的错误,这无形中增加了系统维护成本。
题目
接下来让我们来看一些水题来更好的理解vector
逆序输出
Description
Input
Output
Sample Input
3
1 7 5
Sample Output
5 7 1
#include<bits/stdc++.h> using namespace std; typedef long long ll; vector<ll> a; inline ll read() { ll a=0,f=1; char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();} return a*f; } int main() { ll n=read(); for(ll i=1,b;i<=n;i++) b=read(), a.push_back(b); for(ll i=a.size()-1;i>=0;i--) printf("%lld ",a[i]); }
很水的一题,请自行分析
数组元素的查找
Description
Input
Output
Sample Input
4
1 2 3 3
3
Sample Output
3
#include<bits/stdc++.h> using namespace std; typedef long long ll; vector<ll> a; inline ll read() { ll a=0,f=1; char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();} return a*f; } int main() { ll n=read(); for(ll i=1,b;i<=n;i++) b=read(), a.push_back(b); ll m=read(); ll flag=0; for(ll i=0;i<a.size();i++) if(a[i]==m) { flag=1; printf("%lld",i+1); break; } if(!flag) cout<<"-1"; }
这一题要访问位置,用迭代器会比较麻烦
元素插入有序数组
Description
给你一个整数n和一个数列,这个数列保证从小到大排列,现要求将这个整数n插入到数列中,使新的数列仍然从小到大排列。
n<=100
Input
Output
Sample Input
2
4
1 3 4 5
Sample Output
1 2 3 4 5
#include<bits/stdc++.h> using namespace std; typedef long long ll; vector<ll> a; inline ll read() { ll a=0,f=1; char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();} return a*f; } int main() { ll m=read();ll n=read(); for(ll i=1,b;i<=n;i++) b=read(), a.push_back(b); ll flag=0; for(vector<ll>::iterator it=a.begin();it!=a.end()-1;it++) { if(!flag&&*it>m) { printf("%lld ",m); flag=1; } printf("%lld ",*it); } if(!flag) { ll aa=a.back(); if(m>=aa) printf("%lld ",aa), printf("%lld",m); else printf("%lld ",m), printf("%lld",aa); return 0; } printf("%lld",a.back()); }
这一题我这样写是为了防止最后一个输出的数后面出现空格
数组元素的移动
Description
Input
Output
Sample Input
8
1 2 3 4 5 6 7 8
1
Sample Output
2 3 4 5 6 7 8 1
#include<bits/stdc++.h> using namespace std; typedef long long ll; vector<ll> a; inline ll read() { ll a=0,f=1; char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();} return a*f; } int main() { ll n=read(); for(ll i=1,c;i<=n;i++) c=read(), a.push_back(c); ll m=read();ll b=a[m-1]; for(ll i=m-1;i<a.size()-1;i++) a[i]=a[i+1]; a[a.size()-1]=b; for(ll i=0;i<a.size()-1;i++) printf("%lld ",a[i]); printf("%lld",a[a.size()-1]); }
数组元素的插入
Description
Input
Output
Sample Input
5
7 2 3 4 5
2
9
Sample Output
7 9 2 3 4 5
#include<bits/stdc++.h> using namespace std; typedef long long ll; vector<ll> a; vector<ll> b; inline ll read() { ll a=0,f=1; char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();} return a*f; } int main() { ll n=read(); for(ll i=1,c;i<=n;i++) c=read(), a.push_back(c); ll x=read(),y=read(); for(ll i=0;i<x-1;i++) b.push_back(a[i]); b.push_back(y); for(ll i=x-1;i<a.size();i++) b.push_back(a[i]); for(ll i=0;i<b.size()-1;i++) printf("%lld ",b[i]); printf("%lld",b[b.size()-1]); }
数组元素的删除
Description
Input
Output
Sample Input
5
1 2 3 4 5
3
Sample Output
1 2 4 5
#include<bits/stdc++.h> using namespace std; typedef long long ll; vector<ll> a; vector<ll> b; inline ll read() { ll a=0,f=1; char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();} return a*f; } int main() { ll n=read(); for(ll i=1,c;i<=n;i++) c=read(), a.push_back(c); ll x=read(); for(ll i=0;i<x-1;i++) b.push_back(a[i]); for(ll i=x;i<a.size();i++) b.push_back(a[i]); for(ll i=0;i<b.size()-1;i++) printf("%lld ",b[i]); printf("%lld",b[b.size()-1]); }
数组元素的排序
Description
Input
Output
Sample Input
8
1 2 3 6 8 7 4 5
Sample Output
1 2 3 4 5 6 7 8
#include<bits/stdc++.h> using namespace std; typedef long long ll; vector<ll> a; inline ll read() { ll a=0,f=1; char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();} return a*f; } int main() { ll n=read(); for(ll i=1,c;i<=n;i++) c=read(), a.push_back(c); for(ll i=0;i<a.size();i++) for(ll j=0;j<a.size();j++) if(a[i]<a[j]) { ll c; c=a[i]; a[i]=a[j]; a[j]=c; } for(ll i=0;i<a.size()-1;i++) printf("%lld ",a[i]); printf("%lld",a[a.size()-1]); }
sort(b.begin(), b.end(), greater<
int
>());