(acm)C++加速输入的几种方法
【摘要】 1.C++IO流的同步和绑定
在C++中,cin和cout的速度其实不并不慢,C++中的流的IO速度相当的快,其速度与初始设定的缓存区大小和硬盘的IO速度有关。
但在C++中,为了兼容C的IO(scanf和printf),cin和cout被设置为与C的IO同步,这样导致cin和cout的速度不如scanf和printf快。
另外,在默认情况下,标准输入设备(cin)与标...
1.C++IO流的同步和绑定
在C++
中,cin
和cout
的速度其实不并不慢,C++
中的流的IO速度相当的快,其速度与初始设定的缓存区大小和硬盘的IO速度有关。
但在C++
中,为了兼容C
的IO(scanf
和printf
),cin
和cout
被设置为与C的IO同步,这样导致cin
和cout
的速度不如scanf
和printf
快。
另外,在默认情况下,标准输入设备(cin
)与标准输出设备(cout
)绑定在一起,它保证在调用输入之前已经刷新输出缓冲区,这样也会降低读取效率。
所以,我们可以手动取消他们与C语言IO的同步,并去掉cin
和cout
的绑定,加速读取,使cin
的速度与scanf
相差无几,甚至某些情况要快于scanf
。
注:在取消绑定后,使用scanf
和printf
可能会出现问题,比如读取失败或者提前输出的问题,请不要再使用他们,不过可以使用getchar
和gets
等读入函数。
加速代码:
// 取消C++ IO与C的同步 |
|
std::ios::sync_with_stdio(false); |
|
// 取消cin和cout的绑定 |
|
std::cin.tie(NULL);/*等价于cin.tie(0);*/ |
2. 快读挂
在读取大量整数时,无论是cin
还是scanf
,都比getchar
的读取效率要慢上不少,我们可以使用getchar
来模拟输入函数,在读取大量整数的时候效率会很高:
下面给出其中的一种实现方法:
inline void read(int& x) { |
|
x = 0; |
|
char c; |
|
for (c = getchar(); c < '0' || c > '9'; c = getchar()) |
|
; |
|
for (; c >= '0' && c <= '9'; c = getchar()) |
|
x = (x << 3) + (x << 1) + c - '0'; |
|
} |
3.交互式oj(如leetcode)的加速方法
将其放在solution
类的上方即可,一般情况用不到。
static auto __=[](){ |
|
std::ios::sync_with_stdio(false); |
|
cin.tie(nullptr); |
|
return nullptr; |
|
}(); |
|
//注意放在solution上面 |
文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。
原文链接:fantianzuo.blog.csdn.net/article/details/107269428
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)