天天看點

C++ 快讀

最近快讀在CSDN比較多滾啦喂 ,我也來蹭一波熱度

先看代碼:

inline int read()
{
    int s = 0, w = 1;//s表示那個數的絕對值,w是符号
    char ch = getchar();//因為getchar比scanf這些都快,是以用getchar
    while (ch < '0' || ch > '9')//如果不是數字
    {
        if (ch == '-')//如果是負号
        {
            w = -1;//設定符号為負
        }
        ch = getchar();//下一個
    }//現在已經沒有非數字字元了,下面的ch就都是數字了
    while (ch >= '0' && ch <= '9')
    {
        s = (s << 1) + (s << 3) + ch - 48;//把每一位往上加并使用位運算提速
        ch = getchar();//下一個
    }
    return s * w;//全部讀取完畢,傳回這個數
}
           

呃,這個模闆可以原封不動的套到long long

那麼char和char*還有string也很明顯了

是以可以寫出來一個大集合:

class Scanner
{
private:
    bool blank(char c);
public:
    int readInt();
    long long readLL();
    char readChar();
    void readCStr(char *c);
    string readString();
}
int Scanner::readInt()
{
    int s = 0, w = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
        {
            w = -1;
        }
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        s = (s << 1) + (s << 3) + ch - '0';
        ch = getchar();
    }
    return s * w;
}
long long readLL()
{
    long long s = 0;
    int w = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
        {
            w = -1;
        }
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        s = (s << 1) + (s << 3) + ch - '0';
        ch = getchar();
    }
    return s * w;
}
char Scanner::readChar()
{
    return getchar();
}
void Scanner::readCStr(char *c)
{
    char ch = getchar();
    while (blank(ch)) ch = getchar();
    int p = 0;
    for (c[p++] = ch; !blank(ch = getchar()); c[p++] = ch);
    c[p] = '\0';//結尾
}
string Scanner::readString()
{
    char strBuf[10000];
    readCStr(strBuf);
    string s = strBuf;
    return s;
}
bool Scanner::blank(char c)
{
    return c == ' ' || c == '\r' || c == '\n' || c == '\t';
}//愉快的結束啦
           

你們可以試着重載一下Scanner

繼續閱讀