天天看点

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

继续阅读