[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('\n');
    }
    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 == '\n') && pin - in != countin) pin ++;
        if (pin - in == countin) return -1;
        while (*pin != ' ' && *pin != '\n' && 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 ++;
    }
};

转载于:https://www.cnblogs.com/jklongint/p/4774075.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值