C++中读取未知数量n个正整数时哪种cin输入方式速度更快?
C++ 未知数量正整数输入方案速度对比
首先直接给出三种方案的速度排序:getchar 自定义读取 > 关闭同步后的 cin 流式读取 > getline 自行解析字符
现有两种方案的问题分析
- 第一种
cin >> x实现:你当前只设置了cin.tie(NULL),没有关闭cin和C stdio的同步,默认状态下速度很慢。需要补充ios::sync_with_stdio(false)之后才能发挥cin的性能,这种方案不需要你手动处理数字拼接、分隔符跳过逻辑,代码不易出错,适合大多数对性能要求不是极致苛刻的场景。 - 第二种
getline读整行再遍历的实现:存在明显的功能缺陷,你的需求是读取未知数量的正整数,单次getline只能读取一行输入,如果输入有多行就会漏读。同时你需要自行实现字符转整数、分隔符处理逻辑,容易出现边界错误,且getline本身也属于cin的接口,性能上限和第一种方案持平,开发成本反而更高。
getchar方案的优势与正确实现
getchar是C标准库中封装层级最低的字符读取接口,运行开销最小,是三种方案中速度最快的选择,适合对输入性能有极致要求的场景。
正确的使用示例代码如下:
// 自定义快读函数,适配正整数读取需求 int fast_read() { int num = 0; char ch = getchar(); // 跳过所有非数字的分隔符(空格、换行、制表符等) while (ch < '0' || ch > '9') { ch = getchar(); // 读到输入结束直接返回EOF终止循环 if (ch == EOF) return EOF; } // 拼接连续数字为整数 while (ch >= '0' && ch <= '9') { num = num * 10 + (ch - '0'); ch = getchar(); } return num; } // 调用方式 int main() { int x; while ((x = fast_read()) != EOF) { // 处理读取到的正整数x } return 0; }
如果需要读取更大范围的正整数,只需要把fast_read函数的返回值和num变量的类型修改为long long即可。
内容的提问来源于stack exchange,提问作者Hiển Nguyễn Minh
相关产品推荐
相关产品推荐

