c++注意事项

我写的博客里有些内容需要特殊手段才能看到

转c++时间:
2017年8月9号

1、记得打头文件
2、=与==的区别(赋值|比较)
3、各种运算符的比较级(与Pascal不同)
*4、在OJ上scanf和printf时间优于cin、cout,但是在c++上差不多
5、用define定义max和min会更快
这样写:

#define min(x,y) (x<y?x:y)
#define max(x,y) (x>y?x:y)

如图
这里写图片描述
*6、c++一般爆变量范围和数组范围都不会提示,只是会搞出一些奇怪的结果。
7、c++数组下标最小为0。
8、在if中,可以用=来给变量赋值,不会判错,所以如果==打成=就会错。
9、c++用字符串前要加上using namespace std;
10、c++的字符&&字符串实际都是整数,即该字符的ascii码。
11、c++scanf输入时,变量前要加”&”。
12、c++scanf前要加”%”+该类型对应的字符,否则有可能会出错。
13、printf中\n是换行。
14、cout中 << endl是换行。
15、Pascal中exit是return,halt是exit。break、continue不变。
16、c++中for循环基本相当于pascal的while循环。
17、过程的类型是void。
18、一般来说,c++在代码长度和运行时间都优于Pascal。
*19、万能头文件:#include< bits/stdc++.h>
*20、手动O2:
attribute((optimize(“-O2”)))
加在主程序、子程序前
21、取消同步
ios::sync_with_stdio(false);
加完后可使cin、cout 接近 printf和scanf的速度。

*22、关于程序结尾加不加return 0
见此:https://zhidao.baidu.com/question/374166755.html
最好加上去。

*23、判断C++文件结束
和pascal大致,不过EOF(大写)是一个常量(一般是-1):
当scanf(读入内容)==EOF时表示读到结尾。
见此:https://zhidao.baidu.com/question/393160350.html

*24、C++关闭文件
fclose(cstdin/cstdout);
noip中一定要关

25、C++中用Ctrl+/可以快速注释/恢复一行
方便很多

26、C++bitset用法
可以拿来进行二进制操作
见此:http://blog.csdn.net/qll125596718/article/details/6901935

27、C++快速读入
奇♂妙

inline int getint() { char c; int ret=0, k=1; for(c=getchar(); c<'0' || c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) ret=ret*10+c-'0'; return k*ret; }

*28、register是好东西
在变量名前加register,跑得飞快
详细

29、c++自带的东西比一般的要快
不然你写的就会成为新的模板
话说之前听别人说c++的快排更慢于是打了将近一年的手打快排

30、FFT循环的顺序不同,在O2模式下时间差异很大
就像这两段代码:

void fft(C a[],int type)
{
    for (int i=0; i<N; i++) AA[i]=a[c[i]];
    for (int i=0; i<N; i++) a[i]=AA[i];

    for (int s=N>>1,S=2,S2=1,i=1; S<=N; i++,S2=S,s>>=1,S<<=1)
    {
        C W(Cos[i] , Sin[i]*type);

//      ①
//      C w(1,0);
//      fo(j,0,S2-1)
//      {
//          for (l=j; l<N; l+=S)
//          {
//              u=a[l];v=w*a[l+S2];
//              a[l]=u+v;a[l+S2]=u-v;
//          }
//          w=w*W;
//      }

//      ②
        for (l=0; l<N; l+=S)
        {
            C w(1,0);
            fo(j,0,S2-1)
            {
                u=a[l+j];v=w*a[l+j+S2];
                a[l+j]=u+v;a[l+j+S2]=u-v;
                w=w*W;
            }
        }
    }
}

①是先枚举每个段里的位置,然后一起算。
②是一个段一个段分开来搞。
测试结果发现②跑15000ms,①>20000ms
bzoj3513: [MUTC2013]idiots

(但不开O2似乎①更快些)

c++模板

#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
using namespace std;
__attribute__((optimize("-O2")))
inline int getint() { char c; int ret=0, k=1; for(c=getchar(); c<'0' || c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) ret=ret*10+c-'0'; return k*ret; }

int main()
{
    ios::sync_with_stdio(false);

    freopen("文件名.in","r",stdin);
    freopen("文件名.out","w",stdout);

    fclose(stdin);
    fclose(stdout);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/gmh77/article/details/77103873