众所周知,C++的cin和cout速度很慢,在OJ上会耽误大量的时间

因此一般使用cin,cout时 会在main的第一行加上一句:

iostream::sync_with_stdio(false);

这句话会解除cin,cout和stdio之间的同步锁 这样cin和cout的速度会有明显的改善

和scanf和printf不相上下 有时候甚至比后两者更快一些

但是注意 执行完上述语句后只能使用{cin,cout}和{printf,scanf,putchar,getchar}的一边

如果两个集合里的函数混用 会导致输出顺序混乱(前面的和后面的字符穿插在一起乱七八糟)

我一般习惯解除同步锁之后直接用cin,cout

选择上面的方法或者直接采用scanf printf 基本上可以应付绝大多数问题 但如果一道题目的数据量特别大

(比如T<10000000组输入数据 每组若干个数的时候) 以上方法也有些力不从心

这时就需要用到快速读入模板

这个模板的原理之一是用较快的getchar代替scanf或者cin 使速度有一个较大的提升

而一个一个字符地getchar显然效率上有些低 所以更好的方法是用fread把数据读入缓冲区(一次数万个字符)再处理

这样几乎是最快的方法了

网上有一个很流行的快读模板(因为到处都是实在找不到发布源了)是这样的:

这个也是我们学校学长推荐的快读模板

namespace fastIO {#define BUF_SIZE 100000//fread -> readbool IOerror = 0;inline char nc() {static char buf[BUF_SIZE], *p1 = buf + BUF_SIZE, *pend = buf + BUF_SIZE;if(p1 == pend) {p1 = buf;pend = buf + fread(buf, 1, BUF_SIZE, stdin);if(pend == p1) {IOerror = 1;return -1;}}return *p1++;}inline bool blank(char ch) {return ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t';}inline void read(int &x) {char ch;while(blank(ch = nc()));if(IOerror)return;for(x = ch - '0'; (ch = nc()) >= '0' && ch <= '9'; x = x * 10 + ch - '0');}inline void readll(long long int &x) {char ch;while(blank(ch = nc()));if(IOerror)return;for(x = ch - '0'; (ch = nc()) >= '0' && ch <= '9'; x = x * 10 + ch - '0');}#undef BUF_SIZE
};

上面模板的效率确实很高 但是个人认为用函数来写读入很麻烦

比如输入三个整数a b c 必须要写read(a);read(b);read(c);才行 而且上述模板不支持输入负数也很麻烦

于是我做了一些修改 所有的读入函数使用重载运算符>>的方式实现

而且 不限制读入的数据类型(如果不是可以加速的整数类型会自动转给cin读入)

并且增加了一个快速写模板 把整数的输出任务用putchar执行 也提高了输出的速度

修改后的模板如下:(main函数中是测试代码)

#include <bits/stdc++.h>
using namespace std;
// *Copyright by i.Pear Works*
//本IO模块的用途是方便地读写大量整数
//若题目整数不多 请改用关闭同步锁的cin(因为本模块不支持关闭同步锁)或scanf
namespace FastIO{//不支持while(qin>>x)的多组数据输入方法
//任何情况下请不要关闭sync_with_stdio同步锁!!
//如果您选择关闭同步锁以获得更高的cin/cout速度 使用此模块会导致不可预期的后果//此处为负数读取功能开关
//若程序不会读入负数 请去除下方注释符号 以获得30%的输入提速
//#define DisableNegative true//此处为兼容性模式开关 若程序IO存在 *任何* *int/ll/char[]/string/char(包括空格回车)* 之外的类型
//请去除下方注释符号 降低一半的速度以获得兼容性
//#define EnableCompatibility trueclass Scanner{char cht;bool ifNegative;char stringBuf[10000];
#ifndef EnableCompatibility
#define BUF_SIZE 524288char nc(){static char buf[BUF_SIZE],*p1=buf+BUF_SIZE,*pend=buf+BUF_SIZE;if(p1==pend){p1=buf;pend=buf+fread(buf,1,BUF_SIZE,stdin);if(pend==p1)return ' ';}
#ifndef DisableNegativeif(*p1=='-'){ifNegative=true;p1++;return nc();}
#endifreturn *p1++;}
#elseinline char nc(){return getchar();}
#endifinline bool blank(char ch){return ch=='\r'||ch=='\n'||ch==' '||ch=='\t';}public:Scanner operator>>(int&x){
#ifndef DisableNegativeifNegative=false;
#endifwhile(blank(cht=nc()));for(x=cht-'0';(cht=nc())>='0'&&cht<='9';x=x*10+cht-'0');
#ifndef DisableNegativeif(ifNegative)x*=-1;
#endifreturn *this;}Scanner operator>>(long long int&x){
#ifndef DisableNegativeifNegative=false;
#endifwhile(blank(cht=nc()));for(x=cht-'0';(cht=nc())>='0'&&cht<='9';x=x*10+cht-'0');
#ifndef DisableNegativeif(ifNegative)x*=-1;
#endifreturn *this;}Scanner operator>>(string&str){int p=0;while(blank(cht=nc()));for(stringBuf[p++]=cht;!blank(cht=nc());stringBuf[p++]=cht);stringBuf[p]='\0';str=stringBuf;return *this;}Scanner operator>>(char str[]){int p=0;while(blank(cht=nc()));for(str[p++]=cht;!blank(cht=nc());str[p++]=cht);str[p]='\0';return *this;}template<typename F>inline Scanner operator>>(F&f){cin>>f;return *this;}};class Printer{int num;char chr[21];public:Printer operator<<(int x){if(x==0){putchar('0');return *this;}if(x<0)x*=-1,putchar('-');num=0;while(x) chr[++num]=(x%10)+48,x/=10;while(num) putchar(chr[num--]);return *this;}Printer operator<<(long long int x){if(x==0){putchar('0');return *this;}if(x<0)x*=-1,putchar('-');num=0;while(x) chr[++num]=(x%10)+48,x/=10;while(num) putchar(chr[num--]);return *this;}inline Printer operator<<(char x){putchar(x);return *this;}Printer operator<<(const char str[]){int p=0;while(str[p]!='\0'){putchar(str[p++]);}return *this;}inline Printer operator<<(string&x){for(string::iterator i=x.begin();i<x.end();i++)putchar(*i);return *this;}template<typename F>inline Printer operator<<(F&f){cout<<f;return *this;}};Scanner qin;Printer qout;
#define endl '\n'
}
using namespace FastIO;//-----------------模板到此结束 以下是测试代码--------------------int main(){//testfreopen("D:\\1.txt","r",stdin);long long int arr[10];for(int i=1;i<10;i++){qin>>arr[i];}for(int i=1;i<10;i++){qout<<arr[i]<<endl;}
}int main2(){// !!run this test with "EnableCompatibility" mode onfreopen("D:\\1.txt","r",stdin);long long int a;long long int b;int c;double d;string e;float f;qin>>a>>b>>c>>d>>e>>f;qout<<a<<" "<<b<<endl<<c<<" "<<d<<endl<<e<<" "<<f;
}

上面的“兼容性模式”是不再建立缓冲区而用疯狂getchar替代 这样不会把后面不是整数的数据也存进缓冲区

实验证明这样速度会慢一半 但是也比scanf快得多

如果不需要读取负数 可以打开上面DisableNegative的开关 编译时会少几个判断 效率也有一些提升

在不开启兼容性+DisableNegative的模式下 和原模板的速度没有区别

简述一下用法:只要把这段代码粘贴到您代码的最上方 然后使用qin,qout(q是quick的意思)代替cin,cout就可以了

所有的输入输出都使用运算符<<,>>来进行

经过测速 虽然用了大量的反复重载和类 速度并未改变 但从使用上来说也许会更方便一些

已知的一些问题:

1.qout不能正确的输出-9223372036854775808这个数(ll的最小值)因为去掉符号会溢出

但只有这一个数不能用 实际需要输出这个数的场合也不多见  就不为了它降低整体效率了

2.快速写部分对于绝大多数类型都有加速作用 但是快读只对整数类型起作用

如果数据中不是含有大量的整数 请慎用此模板(因为与sync_with_stdio不共存)

C++整数快速读写模板(快速读入+快速写)详解相关推荐

  1. java读写json格式的文件方法详解.txt,并批量存储进redis

    捐躯赴国难,视死忽如归.恸哭六军俱缟素,冲冠一怒为红颜.君子坦荡荡,小人长戚戚.风日晴和人意好,夕阳箫鼓几船归.民为贵,社稷次之,君为轻.Java 读写json格式的文件方法详解 文章录入:7747. ...

  2. c语言stl模板,c/c++开发分享C++ 标准模板库 STL 顺序容器详解

    c++ 标准模板库 stl 顺序容器 容器 顺序性 重复性 支持迭代器 vector 动态数组 无序 可重复 随机访问迭代器 deque 双向队列 无序 可重复 随机访问迭代器 list 双向链表 无 ...

  3. 【数据结构】——快排详解

    文章目录 1.快排的含义 2.快排的实现 2.1思路讲解 2.2代码实现 3.快排的时间复杂度分析 4.快排的优化 上一篇文章我们介绍了八大排序中的七种,今天这篇文章主要来详细介绍一种比较重要也是常用 ...

  4. python模板公式代码替换,Python - 字符串模板的安全替换(safe_substitute) 详解

    字符串模板的安全替换(safe_substitute) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27057339 字符 ...

  5. Elastricsearch 索引操作详解(快速入门、索引管理、映射详解、索引别名)

    一.快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 ...

  6. msp432快速入门第二节之sdk的详解

    SDK详解 (一) 目的是快速上手这款单片机,所以一些对于新手不友好的东西我都不会介绍,简略说明就略过. TI的SDK安装后如此: (1).metadata没用,似乎是安装后的遗留产品,好让CCS ( ...

  7. c fread 快读 详解_万事开头难,手把手教你搭建Appium自动化测试环境,实践案例详解...

    随着移动互联网的发展,各行各业纷纷引入了移动端相关测试技术,很多公司都已经研发了基于Web前端与App端的相关应用程序,为了更好的保证软件测试的质量,移动端自动化测试已走进测试世界,随着终端特性的多机 ...

  8. c fread 快读 详解_奔驰ACC(自适应巡航系统)详解

    什么是ACC自适应巡航?ACC自适应巡航( Adaptive Cruise Control ),又可称为智能巡航控制系统,简称ACC系统,它是在传统巡航控制基础上发展起来的新一代汽车驾驶员辅助驾驶系统 ...

  9. js模板字符串自定义类名_详解JavaScript ES6中的模板字符串

    这篇文章主要介绍了详解JavaScript ES6中的模板字符串,JS的ES6版本带来诸多简洁化方面的重大改进,需要的朋友可以参考下 在 ES6 中引入了一种新的字符串字面量 - 模板字符串,除了使用 ...

  10. C++整数快速读写(快速读入+快速写)

    //快读 inline int read() {//register意思是将变量放入寄存器,大幅提升效率register int s = 0, t = 1;register char ch = get ...

最新文章

  1. DHCP服务器的配置详细说明
  2. 学习笔记(31):Python网络编程并发编程-定时器
  3. Linux调优(文件系统)
  4. 在思科路由器上做 _限速
  5. php自己编译扩展,Linux编译PHP添加扩展库的方法
  6. 交换机的VLAN与Trunk配置
  7. 升级总代分享思路_定档了!升级了!1月23日《我家那闺女》第二季要给你“好看”...
  8. EasyConnect下载-百度云盘
  9. linux ora-12162,【转】ORA-12162问题的解决及其补充
  10. DA14580外设篇之GPIO中断
  11. 原来excel也能做职业数据分析(步骤完整且过程详细)
  12. 投射数据卷Secret、ConfigMap、DownwardAPI
  13. 中州韵输入法 linux,linux manjaro安装五笔+拼音输入法(中州韵)
  14. Bootstrap-30分钟就能上手的Bootstrap教程【史上最全】
  15. 【编程语言】计算机编程语言
  16. 来了!Python官方文档中文版
  17. vue vant优惠券使用
  18. 电源上的sense什么意思_开关电源基本术语
  19. web应用开发的主流技术
  20. Processing-当使用代码来绘画

热门文章

  1. mysql count函数 null_MySql中COUNT(XXX OR NULL)
  2. 【BUG】.NET项目|未能加载文件或程序集“xxx”,或它的某一个依赖项。系统找不到指定的文件的通解
  3. licecap免费+轻量+使用简单的录屏制作gif工具
  4. PHP性能分析工具:xhprof
  5. USB PD协议规范
  6. 珠海分销系统官网开发笔记:wordpress中使用canonical标签修复版
  7. r语言library什么意思_关于R语言,你需要知道什么?
  8. 海康摄像头之FTP服务器搭建及使用
  9. Python之网络编程
  10. json解析天气预报java_Json解析-和风天气