天天看點

一、前言 衆所周知:scanf比cin快得多,printf比cout快得多。這裡的優化思想就是運用getchar(putchar)比scanf(printf)快的優勢寫一個模闆,注意,這裡隻是針對整數一、前言二、輸入三、輸出

一、前言

衆所周知:

scanf

cin

快得多,

printf

cout

快得多。這裡的優化思想就是運用

getchar(putchar)

scanf(printf)

快的優勢寫一個模闆,注意,這裡隻是針對整數,浮點數目前不支援。

二、輸入

1.入門級的cin

cin >> a >> b;
           

2.普遍的scanf

scanf("%d%d", &a, &b);
           

3.關閉流同步的cin

ios::sync_with_stdio(false);  
cin >> a >> b;
           

4.讀入優化read

(1).讀入優化

read

,原理是将數字按照數位一個個讀進來(比如數字123)就會依次讀入 1, 2, 3,每次将數字乘10再加目前數字)

int read() {//'&'表示引用,也就是說x是一個實參,在函數中改變了x的值就意味着在外面x的值也會被改變
    int f = 1;//标記正負
    int x = 0;//結果
    char s = getchar();//讀入第一個字元
    while (!isdigit(s)) {//不是數字
        if (s == '-') //不能直接把f = -1,有可能輸入的不是'-'而是其它的東西
            f = -1;
        s = getchar(); //繼續讀
    }
    while (isdigit(s)) {//是數字(一旦不是數字就意味着輸入結束了)
        x = x * 10 + s - '0';
        s = getchar();
    }
    return x * f; //改變正負
}
int main() {
    a = read();
}
           

(2).上面這個隻能讀入int,其它類型的不能讀入,故流出了下面這個版本(代碼的

template <...

是為了能同時讀入多種類型變量

(unsigned)int

longlong

short

都行):

template <typename _Tp>
inline _Tp read(_Tp &x) {
    char ch = getchar(), sgn = 0; x = 0;
    while (ch ^ '-' && !isdigit(ch)) ch = getchar();
    if (ch == '-') ch = getchar(), sgn = 1;
    while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
    if (sgn) x = -x;
    return x;
}
int main() {
    b = read(a);
}
           

5.讀入優化fread

準備區域賽時發現

fread

表現更優秀(這裡和上頭差不多,隻不過是一次性讀入一大串字元,

gc()

函數每調用一次傳回一個字元,相當于上面的

getchar()

).

struct ios_in {
    inline char gc() {
        static char buf[MAXN], *l, *r;
        return (l == r) && (r = (l = buf) + fread(buf, 1, MAXN, stdin), l == r) ? EOF : *l++;
    }
    template <typename _Tp>
    inline ios_in & operator >> (_Tp &x) {
        static char ch, sgn;
        for (sgn = 0, ch = gc(); !isdigit(ch); ch = gc()) {
            if (!~ch) return *this;
            sgn |= ch == '-';
        }
        for (x = 0; isdigit(ch); ch = gc())
            x = (x << 1) + (x << 3) + (ch ^ '0');
        sgn && (x = -x);
        return *this;
    }
}Cin;
int main() {
    Cin >> a;
}
           

比較

C/C++幾種輸入方法的速度大緻為:cin<<scanf<cin(關閉流同步)<read<<freadcin<<scanf<cin(關閉流同步)<read<<freadcin<<scanf<cin(關閉流同步)<read<<fread.

三、輸出

1.入門級的cout

cout << a << b;

2.普遍的printf

printf("%d%d", a, b);
           

3.關閉流同步的cout

ios::sync_with_stdio(false);  
cout << a << b;
           

4.讀出優化write

void write(int x) {
     if (x < 0) putchar('-'), x = -x;
     if (x > 9) write(x / 10);
     putchar(x % 10 + '0');
}
int main() {
    write(a);
}
           

5.數組優化

struct ios_out {
    template <typename _Tp>
    inline void operator << (_Tp &x) {
        char F[MAXN];
        _Tp tmp = x > 0 ? x : (putchar('-'), -x);
        int cnt = 0;
        while (tmp) {
            F[cnt++] = tmp % 10 + '0';
            tmp /= 10;
        }
        while (cnt) putchar(F[--cnt]);
    }
}Cout;
int main() {
    Cout << a;
}
           

比較

C/C++幾種輸入方法的速度大緻為:cout<<printf<cout(關閉流同步)<write<數組優化cout<<printf<cout(關閉流同步)<write<數組優化cout<<printf<cout(關閉流同步)<write<數組優化.

c c++