zoukankan      html  css  js  c++  java
  • [c++ IO加速]快速输入输出

    自己封装的FastIO类,效率虽有所损失,不过实用性提高很多。

    测试,写10000000个整数(86M):

    • printf 2.7s
    • cout 27s
    • FastIO 1s

    测试,读10000000个整数(86M):

    • scanf 1.8s
    • cin 15s
    • FastIO 1s

           

    利用c++的可变参数模板(c++11)和重载可以轻松实现数量不定的混合输入输出。

      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
     67
     68
     69
     70
     71
     72
     73
     74
     75
     76
     77
     78
     79
     80
     81
     82
     83
     84
     85
     86
     87
     88
     89
     90
     91
     92
     93
     94
     95
     96
     97
     98
     99
    100
    101
    102
    103
    104
    class FastIO {
    public:
        FastIO() {
            pin = in;
            countin = countout = 0;
        }
        int read2mem() {
            return countin = fread(in, 1, insize, stdin);
            fclose(stdin);
        }
        int write2disk() {
            return fwrite(out, 1, countout, stdout);
            fclose(stdout);
        }
        int read() { return 0; }
        template<typename T, typename ...R>
        int read(T &f, R &...r) {
            if (get(f) == -1) return -1;
            c = read(r...);
            if (c == -1) return -1;
            return 1 + c;
        }
        void write() {
            put('
    ');
        }
        template<typename T, typename ...R>
        void write(const T x, const R ...r) {
            put(x);
            write(r...);
        }
    private:
        const static int insize = (1 << 20) * 200, outsize = (1 << 20) * 100;
        char in[insize], out[outsize], *pin;
        int countin, countout, a[20], c, negative;
    
        /*** read ***/
        inline bool digit(const char ch) {
            return ch == '-' || ch >= '0' && ch <= '9';
        }
        int get(char s[]) {
            while ((*pin == ' ' || *pin == '
    ') && pin - in != countin) pin ++;
            if (pin - in == countin) return -1;
            while (*pin != ' ' && *pin != '
    ' && pin - in != countin) *s ++ = *pin ++;
            *s = 0;
            return 1;
        }
        int get(char &ch) {
            if (pin - in == countin) return -1;
            ch = *pin ++;
            return 1;
        }
        int get(int &buf) {
            while (!digit(*pin) && pin - in != countin) pin ++;
            if (pin - in == countin) return -1;
            buf = 0;
            negative = 0;
            if (*pin == '-') {
                negative = 1;
                pin ++;
            }
            while (digit(*pin) && pin - in != countin) {
                buf = buf * 10 + *pin - '0';
                pin ++;
            }
            if (negative) buf = -buf;
            return 1;
        }
        /*** write ***/
        void put(unsigned int x) {
            c = 0;
            a[c ++] = x % 10 + '0';
            x /= 10;
            while (x) {
                a[c ++] = x % 10 + '0';
                x /= 10;
            }
            while (c) {
                out[countout ++] = a[-- c];
            }
        }
        void put(int x) {
            c = 0;
            negative = x < 0;
            if (negative) {
                x = -x;
                out[countout ++] = '-';
            }
            a[c ++] = x % 10 + '0';
            x /= 10;
            while (x) {
                a[c ++] = x % 10 + '0';
                x /= 10;
            }
            while (c) {
                out[countout ++] = a[-- c];
            }
        }
        void put(const char &ch) {
            out[countout ++] = ch;
        }
        void put(char s[]) {
            while (*s) out[countout ++] = *s ++;
        }
    };
    
  • 相关阅读:
    服务返返回状态码详解
    LeetCode#28 Implement strStr()
    LeetCode#58 Length of Last Word
    LeetCode#66 Plus One
    spooling技术
    文件的打开与关闭
    DMA方式与通道方式
    中断向量、向量中断、向量地址
    中断响应优先级和中断处理优先级
    I/O接口
  • 原文地址:https://www.cnblogs.com/jklongint/p/4774075.html
Copyright © 2011-2022 走看看