ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【C++】读入优化&输出优化

2020-08-26 18:31:37  阅读:243  来源: 互联网

标签:10 read 代码 C++ 读入 优化 getchar


写作原因

写作原因?水博客。
很简单。因为作者NOIP学校考试愉快的写崩了读优,写这篇博客以示警惕。

读入优化

读入优化?这是一个神奇的东西。为什么说它神奇呢? 请看对比图:

对比图

cin.PNGcin_time.PNG
tie.PNGtie_time.PNG
scanf.PNGscanf_time.PNG
read.PNGread_time.PNG
fread.PNGfread_time.PNG
(注:最下面一个是用了fread的读入优化)

附:test_io.in是一个从\(1\)~\(10^7\)的每一个数构成的输入文件。

代码

#define ONLINE_JUDGE
#ifdef ONLINE_JUDGE
char buf[1 << 21], *p1 = buf, *p2 = buf;
inline int getc() { return p1 == p2 && (++p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++; }
#define getchar getc
#endif
template <typename T>
inline T read() {
    T a = 0; char c = getchar(), f = 1;
    for(; c < '0' || c > '9'; c = getchar())
        if(c == '-') f = -f;
        else if(c == -1) return -1;
    for(; c >= '0' && c <= '9'; c = getchar()) a = (a << 1) + (a << 3) + (c ^ 48);
    return a * f;
}

首先,先来解读read的部分。有关template的部分请查阅这篇博客
原理:getchar的速度比scanf快。
所以,我们可以按照读入字符串的形式来模仿读入一个数。
完了…………
好再来getc的部分(没错就是看,而不是理解)——没什么好理解的,就是背模板
但是用了fread,就只能文件输入输出,所以上面的#define ONLINE_JUDGE就是拿来交在\(OJ\)上时用的,一般用小黑板测试时是注释掉的。
那一句#define getchar getc就是把后面的所有getchar当做getc来处理。
其它操作不会的就度娘吧……
天哪读入优化竟然都有我自己造的板题……(其实不用fread也能过……)
另外,这个代码当然不能用read<double>这种操作,因为double是不支持位运算的。(话说位运算怎么被我旷了)Although你不用位运算也不能用double,因为在代码中没有涉及小数和小数点

另外说一句,洛谷上测竟然比我上面的自测时间短?!砸电脑。
而且——另外一个大佬那Copy来的表

有锤子吗?借一个。

输出优化

因为作者没有写崩输出优化,所以输出优化不是重点。
既然不是重点,那就直接给代码吧!
背代码就好了嘛。

template <typename T>
inline void write(T x) {
    if(x < 0) x = (~x) + 1, putchar('-');
    if(x / 10) write(x / 10);
    putchar(x % 10 | 48);
}

懒得再去造题了。
话说fwrite到底怎么用至今没搞清楚

没参考过的资料:浅谈C++ IO优化——读优输优方法集锦洛谷日报

标签:10,read,代码,C++,读入,优化,getchar
来源: https://www.cnblogs.com/PI-UKE/p/13566831.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有