• c++加速方法大全


    我们平常写代码的时候,经常超时,非常难受,所以,我写了这篇文章,让你的代码提升速度(这些方法作者亲测有效,用了这些方法,足足提升了1秒!虽然最后题目还是没过

    1、读入、输出加速:

    1. ios::sync_with_stdio(0);
    2. cin.tie(0);
    3. cout.tie(0);

    这三行代码可以提升我们cin和cout的读入和输出速度,具体原理我也不太懂,反正你也不用知道,会用就行了

    但是我们要注意,就算我们用了这三行代码,cin和cout的读入输出速度还是没有printf和scanf快,所以想要加速的更快,就要用printf和scanf

    这里还有一种加速方法,叫快读快写,似乎比printf更快(我也不知道是不是真的)

    1. inline int read(){//快读
    2. int x=0,w=0;
    3. char ch=0;
    4. while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
    5. while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    6. return w ? -x : x;
    7. }
    8. inline void write(int x){//快写
    9. if(x<0)putchar('-'),x=-x;
    10. if(x>9)write(x/10);putchar(x%10+'0');
    11. }

    原理嘛,多看几遍大概都能看懂,主要是怎么用

    快读这么用:

    1. int x;//要读入x
    2. x=read();//x=read读入的值

    快写这么用:

    1. int x=5;//要输出x
    2. write(x);//输出x

    注意,快读不能读入字符,只能读入数字(读入字符一点反应也没有);快写不能写字符,只能输出数字

    快读快写还用升级版:

    1. namespace IO{
    2. int len = 0;
    3. char ibuf[(1<<20)+1],*iS,*iT,out[(1<<25)+1];
    4. #define gh() \
    5. (iS==iT?iT=(iS=ibuf)+fread(ibuf,1,(1<<20)+1,stdin), \
    6. (iS==iT?EOF:*iS++):*iS++)
    7. #define reg register
    8. inline int read(){
    9. reg char ch=gh();
    10. reg int x=0;
    11. reg char t=0;
    12. while(ch<'0'||ch>'9')
    13. t|=ch=='-',ch=gh();
    14. while(ch>='0'&&ch<='9')
    15. x=x*10+(ch^48),ch=gh();
    16. return t ? -x : x;
    17. }
    18. inline void putc(char ch){
    19. out[len++]=ch;
    20. }
    21. template <class T> inline void write(T x){
    22. if (x < 0)
    23. putc('-'),x=-x;
    24. if (x > 9)
    25. write(x/10);
    26. out[len++]=x%10+48;
    27. }
    28. inline void flush(){
    29. fwrite(out,1,len,stdout);
    30. len=0;
    31. }
    32. }
    33. using IO::flush;
    34. using IO::putc;
    35. using IO::read;
    36. using IO::write;

    虽然我知道这是升级版,但我不会用╥﹏╥

    2、O3优化:

    #pragma GCC optimize(2)

    写代码的时候,把这句写进去(写在头文件下面),就能加速了,这是O2优化,那什么是O3优化呢?

    #pragma GCC optimize(3)

    这就是O3优化,把2改成3就好了,很简单吧?而且O3确实比O2快(亲测有效)

    3、i++和++i

    注意了,我们平常老师教我们写循环,都是这样:

    1. for(int i=1;i<=n;i++){
    2. }

    千万不能这么写,要这样写:

    1. for(int i=1;i<=n;++i){
    2. }

    如果可以,把所有的i++换成++i,特别是循环的时候,如果循环几千几万次,时间真的差很多:

    注意了,i++和++i的含义也有区别

    ++i先让i加1,再返回i的值;而i++是先返回i的值,再让i加1。

    4、变量类型:

    一般来讲,我是喜欢一直用longlong而不是int,因为一般没什么区别,还能防止数据溢出

    但是!要注意!如果题目中很明显的告诉你,这个变量用int就够了,就不要傻傻地用longlong(比如题目说1<=n<=100,n用int就够了)

    因为longlong的范围大了,运算的时间也更多了,会比int慢一倍!

    比如int a;a+1可能要算1ms,

    而long long a;  a+1可能要算2ms!!!


    好了,这就是我知道的所有加速方法了,当然还是有一些小细节的东西,比如在循环内定义变量合在循环外定义变量有什么区别,这些我就不太懂了,你们可以找别的问文章

  • 相关阅读:
    关于“& with in |”的警告处理
    Stable Diffusion 系统教程 | 强大的ControlNet 控制网
    Java8新特性-摆脱坑爹的时间API
    bp神经网络解决什么问题,bp神经网络的改进方法
    1.12 进程注入ShellCode套接字
    boost之日期 时间(date_time)
    【AI视野·今日CV 计算机视觉论文速览 第279期】Tue, 31 Oct 2023
    实验二 数据选择器的设计与vivado集成开发环境【Verilog】
    Linux驱动移植USB网卡r8156驱动(详细)总结
    Linux之(6)Kconfig基础知识
  • 原文地址:https://blog.csdn.net/ptyz306/article/details/133209458