大家都知道有些题只开单纯的数组实在太难写了,
所以STL是一个非常好的东西;
先介绍一下vector:
vector可以支持迅速的随机访问,但vector一般都在末尾进行删减;
#include<vector> 头文件,万能头是包含的
vector<int> a; 定义一个int型的vector
a.push_back(); 在末尾加上一个数
a.pop_back(); 删去末尾一个数
front 返回vector的第一个数,示例:int b=a.front(); 等价于*a.begin() 和 a[0]
back 返回vector的最后一个数,示例:int b=a.back(); 等价于*--a.end() 和 a[a.size()-1]
这是基础用法,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
Description
给你m个整数,将其逆序输出
Input
第一行一个整数m(3 <= m <= 100 ):数的个数 第二行m个整数(空格隔开)(这些数在0-9999999之间)
Output
m个整数(空格隔开)
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
给你m个整数,查找其中有无值为n的数,有则输出该数第一次出现的位置,没有则输出-1。
Input
第一行一个整数m:数的个数 ( 0 <= m <= 100 ) 第二行m个整数(空格隔开)( 这些数在 0-999999范围内 ) 第三行为要查找的数n
Output
n的位置或-1
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
第一行一个整数n :等待插入的数 第二行一个整数m :数列中数的个数 第三行m个整数(空格隔开)
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
数组元素的移动,把数组的第x个位置的元素先保存起来,然后把x+1到n的元素,依次往前移一位,最后原来的第x个位置的元素放在最后
Input
有三行 第一行有一个整数n(1<=n<=100); 第二行有n个整数 第三行有一个整数x
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
在一个数组的第x个位置插入一个新的数y
Input
有四行 第一行有一个整数n ( 5 <= n <= 10 ) 第二行有n个整数 第三行有一个整数x,为要插入的位置 第四行有一个整数y,为要插入的整数
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
把一个数组的第x个位置的元素删除掉
Input
有三行 第一行有一个整数n 第二行有n个整数 第三行有一个整数x,为要删除的位置
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
有两行 第一行有一个整数n( 5 <= n <= 10 ) 第二行有n个整数
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]); }