STL的效率
谈论STL的效率问题
仅代表个人观点!
前话
某些时候\(STL\)可能会慢一点,但是你会发现\(STL\)让你的的代码变得更加整洁,且用起来方便。
所以说,应需求来变化!但是一定要有取舍(比如说在\(AC\)上,不要犹豫)。
我的使用和习惯
平时做题的时候都是如果能\(AC\),就不会刻意避开\(STL\)的使用;
一般在比赛的时候(非速度赛),就用数组模拟(防止卡点数据)。
像哈希表,偷懒的时候不愿意手写就用\(unordered \ map\)。
还有\(vector\)支持动态操作还有很多功能,是很\(useful\)的工具!
像我们平时用的堆,则是\(priority \ queue\)。
但是也有时候,题目用STL就是过不了
这道题:Acwing.1120
正确代码
#include <iostream>
#include <vector>
using namespace std;
typedef vector<int> VI;
const int N=11;
int p[N][N];
int n;
int v[N];
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
bool check(int c,int g,int len)
{
for(int i=0;i<len;i++)
if(gcd(p[g][i],c)!=1) return false;
return true;
}
int res=2e9;
bool st[N];
//u -> 已经遍历的组数,g -> 当前正在填充的组数,len -> 当前组内元素个数,start表示开始遍历的位置
void dfs(int u,int g,int len,int start)
{
if(g>=res) return;
if(u==n) res=g;
bool flag=false;
for(int i=start;i<n;i++)
if(!st[i]&&check(v[i],g,len))
{
st[i]=true;
p[g][len]=v[i];
dfs(u+1,g,len+1,i+1);
st[i]=false;
flag=true;
}
if(!flag) dfs(u,g+1,0,0);
}
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>v[i];
dfs(0,1,0,0);
cout<<res;
return 0;
}
错误代码(卡vector)
#include <iostream>
#include <vector>
using namespace std;
typedef vector<int> VI;
const int N=11;
VI p[N];
int n;
int v[N];
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
bool check(int c,VI a)
{
for(int i=0;i<a.size();i++)
if(gcd(a[i],c)!=1) return false;
return true;
}
int res=2e9;
bool st[N];
void dfs(int u,int g,int start) //个数,组数和遍历起点
{
if(g>=res) return;
if(u==n) res=g;
bool flag=false;
for(int i=start;i<n;i++)
if(!st[i]&&check(v[i],p[g]))
{
st[i]=true;
p[g].push_back(v[i]);
dfs(u+1,g,i+1);
st[i]=false;
p[g].pop_back();
flag=true;
}
if(!flag) dfs(u,g+1,0);
}
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>v[i];
dfs(0,1,0);
cout<<res;
return 0;
}
为了保险,我在所有比赛的时候都用数组模拟,或者手写代码。
结尾
我认为:STL的效率并没有网上评论的那么低,也许在特定情况下,会慢几倍
而STL的工具你可以点开他的源码看看是怎么实现的,至于效率太慢有待考证
既然这样,我们就随机应变!
本文来自博客园,作者:{三季野花},转载请注明原文链接:https://www.cnblogs.com/SanGarden/articles/16526509.html