核心概述
快速读入用于将大块输入一次性读入缓冲并以指针解析,避免逐字符 I/O 的高常数开销,适合大规模数据读取场景。
原文引述
Description: Fast input by reading large chunks into a buffer and parsing numbers/strings from it. Avoids per-character overhead of std::cin/scanf, especially for large datasets.(摘自本节点现有英文注释) Time: O(1) amortized per number; overall O(input size)(摘自本节点现有英文注释) Status: tested(摘自本节点现有英文注释)
展开阐述
-
定义与背景
- 将输入按块读入固定大小缓冲(如 1MB),通过指针在缓冲内解析整数/字符串,降低系统调用频率与分支开销。
- 典型用于 10^5~10^6 量级的整数/字符串读入。
-
接口与语义(据本仓库节点示例风格)
- 全局缓冲:
static const int BUF_SIZE = 1<<20; static char buf[BUF_SIZE], *ptr = buf, *end = buf; - 读整型:跳过空白与符号位,按十进制累计构造数值;返回解析到的整数。
- 读字符串:从当前非空白位置起读到下一个空白/换行处。
- 全局缓冲:
-
核心流程与要点
- 续充缓冲:当
ptr == end时,调用fread读入下一块并重置指针。 - 跳过空白:循环前移指针至首个非空白字符。
- 解析流程:处理符号;循环累乘加位;过程中必要时续充缓冲。
- 线程安全:全局缓冲非线程安全;多线程需各自维护缓冲。
- 与输出混用:必要时
fflush(stdout)以保证 I/O 顺序。
- 续充缓冲:当
-
示例片段(读整型)
inline int readInt() {
int x = 0, f = 0;
while (*ptr <= ' ') {
if (++ptr == end) end = buf + fread(buf, 1, BUF_SIZE, stdin), ptr = buf;
}
if (*ptr == '-') f = 1, ++ptr;
while (*ptr > ' ') {
x = x * 10 + (*ptr - '0');
if (++ptr == end) end = buf + fread(buf, 1, BUF_SIZE, stdin), ptr = buf;
}
return f ? -x : x;
}-
复杂度与边界
- 摊还 O(1)/数;总计 O(输入规模)。EOF 时需返回约定值或做显式判定。
- 缓冲区大小通常取 1<<20,可按环境调整。
-
适用场景与扩展
- 大量整数/浮点/字符串读入;在竞赛/批处理任务中显著降常数。
- 可扩展支持
long long、浮点小数与指数部分、模板化多类型读取。