快读函数read()

本文探讨了C++中不同输入输出方法的性能差异,包括scanf和cin的使用场景。通过实例展示了如何利用`std::ios::sync_with_stdio(false)`和`cin.tie(0)`来加速cin的读入速度,使之接近于scanf。同时,介绍了自定义快速读入函数read()的实现,适用于int、longlong和string类型,以提升竞赛编程中的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天晚上写了牛客月赛40,之后第一题叫是说“读入的数据较大,选择比较快的读入方式。”

目录

scanf读入

cin读入

Read()函数


scanf读入

cin读入相同数据的时间是scanf的3.5~4倍。一般来说,用sacnf读入是要比cin快很多的,要是题目对于时间限制的比较死,就不要犹豫了,毕竟用cin有一定的风险,还是老老实实用sacnf输入。

cin读入

cin读入是比较慢,但是我们可以加上这样一个语句来加快我们读入的速度,(cout和cin一样都还是比较耗费时间的)

std::ios::sync_with_stdio(false); 
cin.tie(0); //对输入加速
cout.tie(0);//对输出加速

加上这个之后,也是和scanf差不多的。

这里关于scanf和cin的性能比较可以去读一下这个大佬的文章

大佬的文章点这里

Read()函数

快速读入函数;先介绍int 类型地。

也就是cin>>a;和这里的a=read();是等价的意思。

int read() {
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
    return x*f;
}

while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}                                                                         这一句就是读入一段很长的数,之后要判断他是负数;


while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();                                                                    这里是把字符串转化为数字,再把x*f作为函数的返回值

当然这里讲的是int 类型的快速读入函数,还有 long long类型的,double 类型,string 类型的;

long long 类型的就是数据范围更加大一些像下面这样就可以了//其实就是改了函数类型

long long read() {
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
    return x*f;
}

string类型的也是类似的,返回类型不一样,返回值也变一下

string StringRead()
{
    string str;
    char ss = getchar(); 
    while (ss == ' ' || ss == '\n' || ss == '\r')
    {
        s = getchar();//遇到这些继续往下读;
    }
    while (s != ' ' && s != '\n' && s != '\r')
    {
        str += s;
        s = getchar();//遇到不是空格,不是换行,不是回车就读入这个字符;
    }
    return str;
}

### C++ 中实现取输入的方法 在处理大规模数据时,C++ 的标准输入方法 `cin` 可能会成为性能瓶颈。为了提升效率,可以采用以下几种优化技术: #### 1. 解除 `cin` 和 `cout` 的绑定 默认情况下,`cin` 和 `cout` 是同步的,即每次执行 `cin` 操作时都会刷新 `cout` 缓冲区。这会影响性能,尤其是在频繁交互的情况下。可以通过调用 `std::ios::sync_with_stdio(false)` 来解除这种绑定关系[^4]。 ```cpp #include <iostream> int main() { std::ios::sync_with_stdio(false); // 关闭同步 int a, b; std::cin >> a >> b; std::cout << (a + b); return 0; } ``` #### 2. 禁用 `cin` 自动刷新 `cout` 除了关闭同步外,还可以通过设置 `cin.tie(NULL)` 进一步减少不必要的开销。这种方法能够防止每次 `cin` 调用时都自动刷新 `cout` 缓存。 ```cpp #include <iostream> int main() { std::ios::sync_with_stdio(false); std::cin.tie(NULL); // 禁止 cin 刷新 cout int a, b; std::cin >> a >> b; std::cout << (a + b); return 0; } ``` #### 3. 使用 C 风格的 I/O 函数 相比 C++ 的流式输入输出 (`cin`, `cout`),C 风格的函数如 `scanf` 和 `printf` 更加高效。它们直接操作底层缓冲区而不涉及额外的类型检查和格式化逻辑[^2]。 ```cpp #include <cstdio> int main() { int a, b; scanf("%d %d", &a, &b); // 使用 scanf 提升速度 printf("%d\n", a + b); // 使用 printf 输出结果 return 0; } ``` #### 4. 实现自定义模板 对于更高需求的情况,可以编写自己的函数来进一步加速输入过程。这种方式绕过了标准库中的复杂机制并专注于核心功能[^3]。 ```cpp inline void fast_read(int &x) { char ch = getchar(); bool neg = false; x = 0; while (!isdigit(ch)) { if (ch == '-') neg = true; ch = getchar(); } while (isdigit(ch)) { x = x * 10 + (ch ^ '0'); ch = getchar(); } if (neg) x = -x; } int main() { int a, b; fast_read(a); fast_read(b); printf("%d\n", a + b); return 0; } ``` 以上四种方法都可以有效改善 C++ 程序中输入部分的时间消耗问题。具体选择哪种取决于实际应用场景以及个人偏好。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Andy℡。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值