快读快写

news/2025/1/10 10:23:35/文章来源:https://www.cnblogs.com/Charlieljk/p/18660658

源码

此处展示的是 2.0 版本源码:

template<typename Tp> inline void read(Tp &x) {x=0; register bool z=true; register char a=getchar_unlocked(); for(;!isdigit(a);a=getchar_unlocked()) if(a=='-') z=false; for(;isdigit(a);a=getchar_unlocked()) x=(x<<1)+(x<<3)+(a^48); x=(z?x:~x+1);}
inline void read(double &x) {x=0.0; register bool z=true; register double y=0.1; register char a=getchar_unlocked(); for(;!isdigit(a);a=getchar_unlocked()) if(a=='-') z=false; for(;isdigit(a);a=getchar_unlocked()) x=x*10+(a^48); if(a!='.') return x=z?x:-x,void(); for(a=getchar_unlocked();isdigit(a);a=getchar_unlocked(),y/=10) x+=y*(a^48); x=(z?x:-x);}
inline void read(char &x) {for(x=getchar_unlocked();(!(x^32)||!(x^10)||!(x^13))&&(x^-1);x=getchar_unlocked());}
inline void read(bool &x) {register char a=getchar_unlocked(); for(;!isdigit(a);a=getchar_unlocked()); x=a^48; for(;isdigit(a);a=getchar_unlocked());}
inline void read(char *x) {register int len=0; register char a=getchar_unlocked(); for(;(!(a^32)||!(a^10)||!(a^13))&&(a^-1);a=getchar_unlocked()); for(;(a^32)&&(a^10)&&(a^13)&&(a^-1);a=getchar_unlocked()) x[len++]=a; x[len]='\0';}
inline void read(string &x) {x=""; register char a=getchar_unlocked(); for(;(!(a^32)||!(a^10)||!(a^13))&&(a^-1);a=getchar_unlocked()); for(;(a^32)&&(a^10)&&(a^13)&&(a^-1);a=getchar_unlocked()) x+=a;}
template<typename T,typename ...Tp> inline void read(T &x,Tp &...y) {read(x),read(y...);}
template<typename Tp> inline void write(Tp x) {if(x<0) putchar_unlocked('-'),x=~x+1; register int len=0; register char tmp[64]; for(;x;x/=10) tmp[++len]=x%10+48; while(len) putchar_unlocked(tmp[len--]);}
inline void write(double x) {register int a=6; register double b=x,c=b; if(b<0) putchar_unlocked('-'),b=-b,c=-c; register double y=5*powl(10,-a-1); b+=y,c+=y; register int len=0; register char tmp[64]; if(b<1) putchar_unlocked(48); else for(;b>=1;b/=10) tmp[++len]=floor(b)-floor(b/10)*10+48; while(len) putchar_unlocked(tmp[len--]); putchar_unlocked('.'); for(c*=10;a;a--,c*=10) tmp[++len]=floor(c)-floor(c/10)*10+48; for(int i=1;i<=len;i++) putchar_unlocked(tmp[i]);}
inline void write(pair<int,double>x) {register int a=x.first; if(a<7) {register double b=x.second,c=b; if(b<0) putchar_unlocked('-'),b=-b,c=-c; register double y=5*powl(10,-a-1); b+=y,c+=y; register int len=0; register char tmp[64]; if(b<1) putchar_unlocked(48); else for(;b>=1;b/=10) tmp[++len]=floor(b)-floor(b/10)*10+48; while(len) putchar_unlocked(tmp[len--]); a&&(putchar_unlocked('.')); for(c*=10;a;a--,c*=10) tmp[++len]=floor(c)-floor(c/10)*10+48; for(int i=1;i<=len;i++) putchar_unlocked(tmp[i]);} else cout<<fixed<<setprecision(a)<<x.second;}
inline void write(char x) {putchar_unlocked(x);}
inline void write(bool x) {putchar_unlocked(x?49:48);}
inline void write(string &x) {fputs(x.c_str(),stdout);}
inline void write(char *x) {fputs(x,stdout);}
template<typename T,typename ...Tp> inline void write(T x,Tp ...y) {write(x),write(y...);}

代码长度 \(2.9k\),如果您不想让自己的代码开局上百行的话建议保持这种每个函数压成一行的形式。

写在前面

  • 有更加简洁的 1.0 版本,但是只支持对于整形的输入输出,读入效率与 2.0 版本完全相同,输出效率略低于 2.0 版本,详见 一些工具。

  • 2.0 版本的存在意义在于在保证了相对较高的效率同时更加方便使用,以避免了需要输出非整形时还需要使用其他读写方式从而降低了效率且不方便使用的问题,而非最求最快,所以在极端卡常环境下作用可能没有一些“超级快读”显著。

  • 绝大多数函数基于 getchar_unlockedputchar_unlocked 实现,没有采用 freadfwrite 的原因是不想让输入输出占用格外的空间,所以效率方面有一定的保证但难以达到最快。

    同时 getchar_unlockedputchar_unlocked 只能在 linux 环境下使用,若评测环境为 windows 请将其更换为 getcharputchar,但这样的话效率大大下降,不如直接用解绑 cincout

    不管什么评测环境,请勿将其和解绑 cincout 同时使用,原因可自行上网查询。

    同时,对于每一个函数,请保证您的传参是合法的,否则出现死循环等问题一概不负责。

  • 对于 double 的输出是存在精度误差的,但是在保留小数点后 \(6\) 位及以内的数据正确率约为 \(100\%\),但是在 \(7\) 位及以上时,即使使用 printf 也会存在精度问题,单位了避免不必要的麻烦,对于 \(7\) 位及以上的,我使用了 cout<<fixed<<setprecision(a)<<b\(a\) 为保留位数,\(b\) 为输出的数,这个 cout 是没法解绑的,但是效率没有比解绑的低太多,所以当其出现精度问题时并不是快写的问题。

  • 经过调试,目前应该没有大的问题,若存在问题请及时指出,我会尽快改正,后续可能要优化代码所以可能会更新版本。

功能介绍

  • 支持对于整形的输入,您可以使用 read(x) 读入一个整形 \(x\),效率保证通过 P10815【模板】快速读入。

  • 支持对于 double 的输入,不支持对于 float 的输入,您可以使用 read(x) 输入一个 double 类型的 \(x\),效率与对整形输入类似。

  • 支持对于 bool 的输入,您可以使用 read(x) 输入一个整形 \(x\),若您输入的 \(x\) 为合法的整形,其将自动识别为 bool 类型,若为 \(0\)\(-0\) 则识别为 false,否则为 true,效率与对整形输入效率类似。

  • 支持对于字符的输入,自动过滤空格与换行,您可以使用 read(x) 读入一个字符 \(x\),如果您想读入一个空格或换行请使用 gatchar 等自带函数。

  • 支持对于字符串的输入,包括一维 char 数组(char*)和 string,您可以使用 read(x) 输入一个字符串 \(x\)

    效率方面,基于 \(O(len)\) 次的 getchar_unlocked,约为 scanf\(2\) 倍,约为不解绑 cin\(10\) 倍,但只有不解绑 cin\(\dfrac{1}{2}\),目前没有想到更好的解决方案,欢迎大家指出。同时不管什么读入方式对于字符串的输入效率都是极高的,不必担心输入字符串被卡常,实测 \(10^9\) 个字符的量只需要 \(0.5s\) 左右。

  • 支持多个类型同时输入,具体的,您可以使用 read(a,b,c,...) 依次进行 \(a,b,c\) 等若干个任意类型的输入。

    特殊的,对于一个 char* 类型的 \(s\),您可以正常的将 \(s\) 传入该函数,但不支持将其类似与 \(s+1\) 的类型传入上述函数,因为我对于输入类型均进行了取地址,而 \(s+1\) 本身就是一个地址,不能够重复两次取地址,存在解决方案但是并不优美,因为我并不想在每个变量前都手动加一个取地址,所以在不影响其他类型输入的手感的前提下,请单独使用 read(s+1)

  • 支持对于整形的输出,您可以使用 write(x) 输出一个整形 \(x\),相对于 1.0 版本的提升在于将其从递归改为递推,从而提高了效率,效率高于解绑的 cout

  • 支持对于 double 的输出,不支持对于 float 的输出,您可以使用 write(x) 输出一个 double 类型的 \(x\),效率高于 printf 和解绑的 cout,精度问题已在前面阐述。

  • 支持对于 bool 的输出,您可以使用 write(x) 输出一个 bool 类型的 \(x\),若 \(x=true\) 输出 1,若 \(x=false\) 输出 0

  • 支持对于字符的输出,您可以使用 write(x) 输出一个字符 \(x\),本质就是把 \(x\) 直接 putchar_unlocked 出去。

  • 支持对于字符串的输出,包括一维 char 数组(char*)和 string,您可以使用 write(x) 输出一个字符串 \(x\)

    此函数不基于 getchar_unlocked 而是基于 fputs,因为对于一个一个字符的输出效率是严格低于整个输出的,使用 fputs 的效率极高,和解绑的 cout 几乎相同。

    也正因为使用了 fputs,若您想要输出的是一个 char*,请保证其末尾字符为 \0

    另外,我对字符串的输出进行了取地址操作,不会占用格外的空间。

  • 支持多个类型同时输出,具体的,您可以使用 write(a,b,c,...) 依次进行 \(a,b,c\) 等若干个任意类型的输出。

    此函数不存在取地址问题,可以放心使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/867042.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS-25 字符串方法_indexOF()

indexOf方法用于确定一个字符串再另一个字符串中第一次出现的位置,返回结果是匹配开始的位置。如果返回-1,就表示不匹配 hello world.indexOf(o)//4 hello world.indexOf(a)//4-1 床前明月光,疑是地上霜。一去二三里,举头望明月,低头思故乡。.indexOf("一去二三里&qu…

点特征直方图

对点特征的描述常见的描述手段有,曲率、法线等,由于点云散乱无序形态各异,即使人眼是判别特征与非特征点都极其困难,所以仅仅凭借曲率、法线来对点云特征进行描述,显然是不够的。那如何准确或者全面的去描述点的特征呢,这也是很多算法的基石,特征描述准确与否直接会影响…

高斯金字塔,高斯模糊,高斯差分

高斯金字塔、高斯模糊和高斯差分是图像处理中非常重要的技术,常用于图像缩放、降噪、特征提取等领域。 1. 高斯模糊(Gaussian Blur) 高斯模糊是一种降噪技术,基于高斯函数的图像处理技术,用于平滑图像,减少噪声或细节。它在图像处理和计算机视觉中非常常用,尤其是在预处…

改造应用从容器tomcat迁移到pas(信创容器中间件)的适配工作

背景 近年来由于信创要求的重视,软件国产化越来越要提上日程了,相信在相关行业的人已经有很多开始在准备信创相关适配改造工作了吧 我们公司也一样,经过2个月的研究终于算是把我们的主要产品改造成功,下面我就介绍下: 我们无源代码的tomcat容器应用如何迁移到普元Pas 正文…

DolphinScheduler自身容错导致的服务器持续崩溃重大问题的排查与解决

01 问题复现 在DolphinScheduler中有如下一个Shell任务: current_timestamp() { date +"%Y-%m-%d %H:%M:%S" }TIMESTAMP=$(current_timestamp) echo $TIMESTAMP sleep 60在DolphinScheduler将工作流执行策略设置为并行:定时周期调度设置为10秒一次:将定时调度上…

NeurIPS 2024最佳论文,扩散模型的创新替代:基于多尺度预测的视觉自回归架构

本文将详细解读NeurIPS 2024最佳论文:**"Visual Autoregressive Modeling: Scalable Image Generation via Next-Scale Prediction(视觉自回归建模:基于下一尺度预测的可扩展图像生成)"**。 该论文提出了视觉自回归建模(Visual Autoregressive Modeling,VAR)方…

2025 款 特斯拉 焕新版 Model Y All In One

2025 款 特斯拉 焕新版 Model Y All In One Tesla Model Y Juniper2025 款 特斯拉 焕新版 Model Y All In OneTesla Model Y Juniperdemos特斯拉 焕新版 Model Y 首发版速览(🐞 反爬虫测试!打击盗版⚠️)如果你看到这个信息, 说明这是一篇剽窃的文章,请访问 https://www.c…

CDS标准视图:总计应收款 I_TotalAccountsReceivables

视图名称:总计应收款 I_TotalAccountsReceivables 视图类型:参数 视图代码:点击查看代码 @AbapCatalog.sqlViewName: IFITOTALACCTRBLS @AbapCatalog.compiler.compareFilter:true @AbapCatalog.preserveKey:true @VDM.viewType: #COMPOSITE @EndUserText.label: Total Acco…

CefSharp.WinForms指定了低版本108.4.130,可是生成后的dll版却是121.3.7.0

问题: CefSharp.WinForms指定了低版本108.4.130 生成的libcef.dll版本却是121.3.7.0, 分析: 之前有指定版本121.3.7.0并生成过。怀疑用的是之前的版本,然后之前的版本的缓存在本地的哪个位置。于是删除项目底下 packages\CefSharp.WinForms.108.4.130 packages\CefSharp.Co…

API 风格选对了,文档写好了,项目就成功了一半!

在前后端开发中,API文档和API风格设计是提高开发效率、减少沟通成本、确保系统稳定性的关键环节。一个清晰、易用的API文档可以帮助前端开发者快速理解接口的使用方法,而完善的测试则能尽早发现潜在问题,避免上线后出现故障。接下来,我们将从 API风格设计 和 API 文档 两个…

macOS的PrivilegedHelperTools文件夹

在 macOS 上,/Library/PrivilegedHelperTools 文件夹是一个特殊的位置,用于存放可以以更高权限运行的辅助工具或守护进程。这些工具通常由各种应用程序安装,以执行需要超出普通应用程序沙箱权限的任务,例如Proxy的应用,常见都是带有helper的应用。让我们更详细地了解这个目…

CDS标准视图:预期应收 I_FutureAccountsReceivables

视图名称:预期应收 视图类型:参数 视图代码:点击查看代码 //Documentation about annotations can be found at http://help.sap.com searching for CDS annotations //Inserted by VDM CDS Suite Plugin @ObjectModel.usageType.sizeCategory: #XXL //Inserted by VDM CDS …