zoukankan      html  css  js  c++  java
  • c/c++输入时间问题

    大家都知道c++兼容完整的c,从理论上来讲cin和cout的速度应该远远大于c中scanf和printf。

    但是在真真做题的时候,当数据输入次数足够多的时候,用cin/cout的会超,而用scanf/printf则能过题,这是为什么?

    1.结论:

    默认情况,cin与stdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱,同时cout和stdout也一样,两者混用不会输 出顺序错乱。正因为这个兼容性的特性,导致cin有许多额外的开销,如何禁用这个特性呢?只需一个语句 std::ios::sync_with_stdio(false);,这样就可以取消cin于stdin的同步了,此时的cin就与scanf差不多 了。

    另一种解释: cout在输出时总是要先将输出的存入缓存区。而printf直接调用系统进行IO,它是非缓存的。所以cout比printf慢。

    sync_with_stdio

    这个函数是一个“是否兼容stdio”的开关,C++为了兼容C,保证程序在使用了std::printf和std::cout的时候不发生混乱,将输出流绑到了一起。

    tie

    tie是将两个stream绑定的函数,空参数的话返回当前的输出流指针。

    解决cin慢的办法:在输入前加入如下三行代码即可。

    int main()
    {
        ios::sync_with_stdio(false);//关闭c++兼容c的特性 
        cin.tie(0);//加速cin 
        cout.tie(0);//加速cout 
        
        return 0;
    }

    2.有些毒瘤出题人,会卡scanf的时间,也就是说要另寻更快的输入。---->getchar()  输入中的邪教

    借鉴博客:https://blog.csdn.net/qq_34287501/article/details/70232038

    整数:

    inline bool scan_d(int &num)  
    {
            char in;bool IsN=false;
            in=getchar();
            if(in==EOF) return false;
            while(in!='-'&&(in<'0'||in>'9')) in=getchar();
            if(in=='-'){ IsN=true;num=0;}
            else num=in-'0';
            while(in=getchar(),in>='0'&&in<='9'){
                    num*=10,num+=in-'0';
            }
            if(IsN) num=-num;
            return true;
    }

    浮点数:

    inline bool scan_lf(double &num)  
    {
            char in;double Dec=0.1;
            bool IsN=false,IsD=false;
            in=getchar();
            if(in==EOF) return false;
            while(in!='-'&&in!='.'&&(in<'0'||in>'9'))
                    in=getchar();
            if(in=='-'){IsN=true;num=0;}
            else if(in=='.'){IsD=true;num=0;}
            else num=in-'0';
            if(!IsD){
                    while(in=getchar(),in>='0'&&in<='9'){
                            num*=10;num+=in-'0';}
            }
            if(in!='.'){
                    if(IsN) num=-num;
                    return true;
            }else{
                    while(in=getchar(),in>='0'&&in<='9'){
                            num+=Dec*(in-'0');Dec*=0.1;
                    }
            }
            if(IsN) num=-num;
            return true;
    }

    强烈输入挂(直接交,看结果需要用文件):

    #define FI(n) FastIO::read(n)
     
    namespace FastIO {
        const int SIZE = 1 << 16;
        char buf[SIZE], obuf[SIZE], str[60];
        int bi = SIZE, bn = SIZE, opt;
        int read(char *s) {
            while (bn) {
                for (; bi < bn && buf[bi] <= ' '; bi++);
                if (bi < bn) break;
                bn = fread(buf, 1, SIZE, stdin);
                bi = 0;
            }
            int sn = 0;
            while (bn) {
                for (; bi < bn && buf[bi] > ' '; bi++) s[sn++] = buf[bi];
                if (bi < bn) break;
                bn = fread(buf, 1, SIZE, stdin);
                bi = 0;
            }
            s[sn] = 0;
            return sn;
        }
        bool read(int& x) {
            int n = read(str), bf;
     
            if (!n) return 0;
            int i = 0; if (str[i] == '-') bf = -1, i++; else bf = 1;
            for (x = 0; i < n; i++) x = x * 10 + str[i] - '0';
            if (bf < 0) x = -x;
            return 1;
        }
    };
  • 相关阅读:
    long和Long的区别
    C语言的变量的内存分配
    Java蓝桥杯 算法提高 九宫格
    Java实现 蓝桥杯算法提高金明的预算方案
    Java实现 蓝桥杯 算法提高 新建Microsoft world文档
    Java实现 蓝桥杯 算法提高 快乐司机
    Java实现 蓝桥杯 算法提高 三角形
    Java实现 蓝桥杯 算法提高 三角形
    Java实现 蓝桥杯 算法提高 三角形
    Java实现 蓝桥杯 算法提高 三角形
  • 原文地址:https://www.cnblogs.com/q1204675546/p/11306305.html
Copyright © 2011-2022 走看看