总是忘记读入优化的板子,在这里 Mark 一下。
需要 cstdio
和 cctype
头文件
不能读负数版(异或 48 是一个神奇的操作)
template<typename Tp> inline void read(Tp &x) {
char c = getchar();
x = 0;
while (!isdigit(c)) c = getchar();
do {
x = x * 10 + (c ^ 48);
c = getchar();
} while (isdigit(c));
}
可以读负数版(因为需要额外的计算,比上面的稍慢一点,但依然吊打自带的读入)
template<typename Tp> inline void read(Tp &x) {
char c = getchar(); int f = 1; x = 0;
if (c == '-') f = -1;
while (!isdigit(c)) c = getchar();
do {
x = x * 10 + (c ^ 48);
c = getchar();
} while (isdigit(c));
x *= f;
}
上面的读入优化有一个缺点,就是当一次要读入很多数而且不能用循环的时候,需要一个一个手打 read()
,比如 read(a), read(b), read(c);
这样远不如 cin
的 cin >> a >> b >> c;
和 scanf()
的 scanf("%d%d%d", &a, &b, &c);
来得方便。
不过 cstdarg 库拯救了我们!只需要加上这个头文件:
template <typename Tp, typename... Args>
inline void read(Tp& t, Args&... args) {
read(t); read(args...);
}
这样就可以愉快使用 read(a, b, c)
这样的形式来读入了,而且似乎比标准读入方式更方便了。
如果上面两个都不想打,可以考虑这个
std::ios::sync_with_stdio(false);
用 cin
和 cout
输入输出即可(格式化输入输出就不能用了)。
实机测试居然比格式化输入快