(日常作死)指针和数组的代码哲学和一些数组的小技巧(雾)

原文链接….

2016-08-07 14:18:20 By immortalCO

一直很喜欢在 struct 时用指针。除了在速度上有优势(数组要做额外的加法),还有一点就是它的代码是符合中英文的语序的。

举个例子:

k->fa->val->max = 1;

如果要解读这段代码,我们可以这样:


设置 
    k 
        的 fa 
            的 val 
                的 max1

因为指针的代码是符合我们常用语言的语序的。如果用数组,我们就必须这样写:

max[val[fa[k]]] = 1

强行解读的话,就变成:

设置
    在所有 max 中,是
        在所有 val 中,是
            在所有 fa 中,是
                k
            的那一个 fa
        的那一个 val
    的那一个 max1

简直佶屈聱牙,难以成颂!然而,一种特殊的 C++ 数组写法可以解决这个问题。在 C++ 中,a[b] 等价于 *(a + b),因此

a[b] = *(a + b) = *(b + a) = b[a]

也就是说,我们可以倒转数组名和下标的位置。比如我们可以

a[i] = i[a]
b[1] = 1[b]
c[2][2] = 2[c[2]] = 2[2[c]] // 每一个 [] 都有两种写法
d[1][2][3][4][5] = 5[4[3[2[1[d]]]]]
A[B[C[D[E[i]]]]] = i[E][D][C][B][A] // [] 是从左往右计算的

这个的第一个用途是混乱代码,防止在 CF 上被 Hack。试想如果你有个 5 维 DP,那么每一维你都有 2 种写法,总共就有 32 种写法,然后你在 DP 中混用这几种写法……(嘿嘿嘿!!!)

观察最后一行左边的那个形式,不正是我们 max[val[fa[k]]] 的形式吗?因此我们可以写成

max[val[fa[k]]] = k[fa][val][max]

嘿嘿嘿!熟悉的语序回来了!而且没有方括号的嵌套,减小了漏打、错打括号导致 CE 的可能性。那么在不方便使用指针(比如 64 位机卡内存)时,我们同样可以用数组做到优美的代码风格。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值