C++加速读取和其他加速

 

标题输入函数对比

模板:

std::ios::sync_with_stdio(false);//关闭同步后据说不能和C的输入输出混用,出玄学问题
std::cin.tie(0);
cout<<'\n';
for(register int i=0;i<n;i++)

要点:

1,fread,read,mmap不是很常用的函数,比较难写,竞赛中一般使用不到,常用的是scanf和cin,比较方便。

2,有些OJ平台对取消同步不敏感,但是这不是取消同步没有用,而是平台有缺陷。

3,使用\n代替endl,还有对使用频繁的变量定义时加上register(寄存器内存比较小,不能使用太多)也能加速

3,建议使用scanf这样可以兼容几乎所有平台,要使用cin则加上如下语句(不能保证所有平台都能加速成功,有过加速失败的经验)

std::ios::sync_with_stdio(false);//关闭同步后据说不能和C的输入输出混用,出玄学问题
std::cin.tie(0);//world fina时tourist队也是这样用的

4,最快的输入输出是使用getchar()和putchar(),也即所谓的输入输出挂。这里暂不总结,很少卡这个,算法复杂度小才是ac的关键

 

 

 

 

详细内容如下:

参考博客https://blog.csdn.net/u013445530/article/details/43381833

    C++中,cin和cout要与stdio同步,中间会有一个缓冲,所以导致cin,cout语句输入输出缓慢,这时就可以用这个语句,取消cin,cout与stdio的同步,说白了就是提速,效率基本与scanf和printf一致。然后就可放心的使用cin,cout了。(不过实际上使用了using namespace std;之后就可以直接写sync_with_stdio(false);了

 

     问题出在scanf()。取消流同步以后,stdio中带有的scanf()和printf()输入输出的内部同步也会被取消(大概是这样的,如果有误请联系博主更正),这时候再用scanf()和printf()就可能会出玄学错误,所以用的时候也要注意。

  另外,如果使用文件输入输出的话,一定记住要把这条语句放在freopen()后面,反正也会出西西,但是具体问题博主也不太清楚。。

 与cstdio流[静态]切换同步

    打开或关闭所有的标准iostream流与它们对于的标准C流之间的同步。

    实际上,这意味着C++和C流使用相同的缓冲区,因此,可以自由地混合使用流。同步C++标准流可以确保线程安全。

    默认情况下,iostream对象和cstdio流同步。如果同步关闭,C++标准流独立地缓冲输入输出,在某些情况下,这是相当快速的。

  参数

    syn

    用于指示是否同步的布尔值,值为true开启同步,为false时关闭同步。

  返回值

    返回被调用之前的同步状态。当它第一次被调用,总是返回true。

 

  使用样例

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    cout.sync_with_stdio(false);
    cout << "a\n";
    printf("b\n");
    cout << "c\n";
}

  程序输出

b
a
c

 

 

2. std::ios::tie

    在默认的情况下cin绑定的是cout,c++11中cin和cerr都默认和cin绑定。

 

 

3.

1. 算法竞赛中,关闭iostream对象和cstdio流同步以提高输入输出的效率。

    即调用ios::sync_with_studio(false);    !特别注意:关闭后C++ IO与C IO不能混用,cin不能与scanf,sscanf, getchar, fgets等混用,cout不能与printf,puts等混用,否则IO会混乱。

2. 在默认的情况下cin绑定的是cout,每次执行 << 操作符的时候都要调用flush,这样会增加IO负担。可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。             即调用std::cin.tie(0);

1     #include <iostream>
2     int main() 
3     {
4         std::ios::sync_with_stdio(false);
5         std::cin.tie(0);
6         // 下面进行IO
7     }

 

4. 其它加速方法

    使用'\n'或者"\n"代替endl。即使用cout<<'\n';和cout<<"\n";

 

5,最快的读取

因为getchar()比scanf要快,故为了加快读入,可以用getchar()代替scanf.

同理输出用putchar();

思路

利用getchar()将数字读入,若为” “或”\n”结束,第一个字符判断一下数字的正负,然后每读入一个数字就将当前数*10并加上它

读取int的示例:

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

int a=read();

我们常用定义变量存放在内存中!而register是指寄存器变量。寄存器是cpu的存储部件,即是高速缓存,通常不大,最多几mb。定义这个变量适用于频繁使用某个变量,以加快运行速度,因为保存在寄存器中,省去了从内存中调用,要注意定义了这个变量后,不能取地址!!就是不能使用&符号,这与一般不同!!如for循环里的i,j等

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值