众所周知,C++的std::cin、std::cout在输入输出整数时(不关流同步)比较慢,容易被卡,关流同步又会有std::cout不能和printf共用的问题,所以快读快写就在这里派上了用场。
传统的快读(快写)有这样使用的
a = read();write(b);
这种快读在输入(输出)多个变量时非常麻烦,使用体验不如std::cin,所以目前应该是仿std::cin、std::cout的快读快写更好用一些,但是也有些场景,比如:
int a = 1;
double b = 1.5;
string str = "hello";
std::cout << a << b << str;
std::cin >> a >> b >> str;
只有整数读取(写入)的模板无法像std::cin、std::cout这么优雅
这是我的优化方案:
namespace fastio
{
struct Reader
{
template <typename T>
Reader &operator>>(T &x)
{
if constexpr (std::is_integral<T>::value)
{
if constexpr (std::is_same<T, char>::value)
{
x = getchar();
}
else
{
char c = getchar();
short f = 1;
while (c < '0' || c > '9')
{
if (c == '-')
f *= -1;
c = getchar();
}
x = 0;
while (c >= '0' && c <= '9')
{
x = (x << 1) + (x << 3) + (c ^ 48);
c = getchar();
}
x *= f;
}
}
else
{
std::cin >> x;
}
return *this;
}
} cin;
struct Writer
{
template <typename T>
Writer &operator<<(T x)
{
if constexpr (std::is_integral<T>::value)
{
if constexpr (std::is_same<T, char>::value)
{
putchar(x);
}
else
{
if (x == 0)
return putchar('0'), *this;
if (x < 0)
putchar('-'), x = -x;
static int sta[45];
int top = 0;
while (x)
sta[++top] = x % 10, x /= 10;
while (top)
putchar(sta[top] + '0'), --top;
}
}
else
{
std::cout << x;
}
return *this;
}
} cout;
}; // namespace fastio
使用C++11的模板元编程和C++17的constexpr if,fastio::cin、fastio::cout便可以在整数输入(输出)时提升性能,同时支持其他类型变量的输入(输出)。只是目前还不支持std::endl、std::flush,算是个小遗憾。
如果无法使用C++17,删除constexpr即可,只是性能会略差一些。