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的工具你可以点开他的源码看看是怎么实现的,至于效率太慢有待考证

既然这样,我们就随机应变!

posted @ 2022-07-27 21:13  Sankano  阅读(112)  评论(0编辑  收藏  举报