• tricks


    笔记总页面

    负下标

    有的时候我们需要存一些负的东西,比如我就只要一个 (-1),或者说值域是 ([-10^6,10^6]),而我懒得写平移
    (写平移不仅麻烦,而且万一忘了就会RE,并且在本地不一定会被检测出来)

    那咋整呢?

    取下标:a[i],它的本质是 *(a+i)

    开一个pool,然后开一个指针a指向pool+1,就可以访问 a[-1] 了

    关于二维数组:

    二维数组事实上是把每一行串起来变成一维数组存储的

    所以说,比如你开了一个 int a[10][10],访问 a[2][-1] 等价于 a[1][9]

    然后我们只需要开一个 p,指向二维数组的一行;然后就可以访问 p[-1][-1] 这样的下标了

    那么二维数组的“一行”,是什么类型呢?实际上,是 int (*p)[10] 的类型。也许你在传函数参数的时候就注意到了,传数组的时候,第一维可以不限,但是后面必须要限制。这里也是一样的。

    int (*p)[10] 只是一个特例,你可以把 10 换成任意数,但是要保持和你开的第二维相同。另外,由于优先级问题,这里的括号不能省略。

    以下是一个例子,使得你可以访问 a[-100~100][-100~100]

    int pool[202][202];
    int (*a)[200]=pool[101];
    

    为什么要多开两个呢?注意到 a[100-100][-1] 是不被允许的,所以 a 必须指向第 101 行,此处要躲开一个;后面要访问到 a[101+100=201],而此时我们才开了 201 行,那肯定不行,所以要开到 202

    在不造成太多浪费的情况下,多开一两个保安全还是不错的。

    动态开点

    固然可以写一个映射函数,如

    #define id(x,y) (x-1)*m+y

    事实上,为了好看,与节省空间,可以这样写

    int id[N][N],tot=0;
    for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) id[i][j]=++tot;
    

    也就是每次用 ++tot 来开点。这样更加的灵活,易懂(因为数组有名字)(当然函数也有名字,但是括号和中括号混合在一起闲的很乱,全都是中括号则很整齐)

    节省空间是因为,有的时候你为了使映射函数好写,可能会浪费一些区间。

    当然映射函数也有它的好处,比如数组开不下的时候映射函数就可以派上用场了。当然,为了可读性,也可以用map,如果必要。

    花括号

    不管是否换行与否,尽量不要省略花括号,如:

    if (...) do_something

    应该写作

    if (...)
    {
    	do_something;
    }
    

    尽管只是很简单的一句话。因为这样不费很多力气,而且方便后期加入功能,与调试。

    而且看起来很整齐,强迫症狂喜

  • 相关阅读:
    docker安装与使用路径
    python3.7简单的爬虫
    ubuntu19.04下查看软件安装目录和详细信息
    Javascript检查对象是否存在某个属性
    bootstrap源码和测试
    python学习笔记之pdb调试
    pydensecrf安装报错1、UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb6 in position 29: invalid start byte2、 LINK : fatal error LNK1158: 无法运行“rc.exe” error: command 'D:\software\vs2015\VC\BIN
    python学习日记:np.newaxis
    好用的网址集锦
    网络配置ipconfig /release、ipconfig /renew
  • 原文地址:https://www.cnblogs.com/LightningUZ/p/14198258.html
Copyright © 2020-2023  润新知