Ziqian_Chen

Ziqian Chen

@Ziqian_Chen

  • 建议川川来🚪作线上讲座

    Post #8 ❤️ 4 likes
  • 问问专业?

    腾讯是来过 XJTU 的,但他们一般春季来宣传实习,并且是单独的教室宣讲,不和外面摆摊的搞在一起。

    米哈游也在西安搞过宣讲会,可能没来 XJTU,是在某个酒店办的,整挺好,如果是 mhy 玩家应该很喜欢。

    游戏三大块,美术的话我估计你不是艺术生,策划的话学历要求高,我估摸着 XJTU 对上米和鹅可能会拖后腿。程序可能容易一点,分类和传统互联网差不多,客户端,后端,测试,数据之类的。建议好好学,多实习,努力 fit 岗位要求。

    Post #7
  • 最近发现了 CRTP 的一个神秘应用。

    考虑如下一种很常见的场景,你有一个很复杂很复杂的类 D,你尝试将其划分出以下模块:

    • 共享信息 A,这部分信息在其他功能模块(B 和 C)都需要使用
    • 功能模块 B
    • 功能模块 C
    • 功能模块 B 和 C 之间的交互和整体接口,称为 D

    为了防止你把一大坨屎山拉在一个文件内,你决定每个文件各拉一坨把他们拆分到不同的文件里去实现。既然你使用了 C++,你希望这个划分满足零开销抽象原则,也就是在时间上和空间上不引入额外的开销。

    我们考虑以下几种方法:

    1. .h 和 .cpp

    C++ 可以把声明放在 .h 中,实现放在不同的 .cpp 里,只要合理拆分 .cpp 那么理论上是可行的,但是这个还是很丑陋,比如你要编译就得把所有 .cpp 丢进编译器(只 include.h 会链接失败)。以及函数声明仍然一坨摆在一个文件里。

    另外分离接口和实现会阻止某些优化,你需要开启 -flto 启用跨文件优化。

    1. 拆成四个类然后多继承

    写一个公共类 A,B 和 C 继承 A 并且 D 多继承 B 和 C。

    这种方法的问题在于出现了菱形继承,于是你会发现 A 的成员变量在 D 中出现了两次,这很不好,不仅导致了歧义还浪费了空间。

    1. 加上虚继承

    加上虚继承解决了空间上的浪费,但很不幸,引入了虚表。这导致时间上的浪费。

    1. 最终解决方法:CRTP

    说到底,实际上你只需要拿到一个指向共有信息 x 的指针,如果你把共有信息写在 A 中并使用多继承,那么无论是时间还是空间总得有地方妥协,因为 C++ 需要保证 B 和 C 的可用性(但你实际上并不会单独使用 B 和 C)。

    所以不妨把共有信息写在 D 中,然后通过 CRTP 的方式拿到 D 的指针进行操作。

    Post #25 ❤️ 1 like
  • oj 是好文明,建议推广

    Post #4 ❤️ 1 like
  • image

    Post #3
  • undefined

    有感而发

    Post #15 ❤️ 3 likes
  • 建议学习官僚的智慧:我白天有课,只有晚上有空,这 x 个晚上我只看 x 次,看完就交给老师,不合格的请自行补交给老师。

    Post #8 ❤️ 2 likes
  • 有没有可能,这是愚人节比赛,大家做着玩的。。。

    Post #3 ❤️ 1 like
  • 你妹提优点

    Post #17
  • Lrefrain:

    CRTP

    有没有可能,CRTP 和虚函数不是一个层面上的东西。虚函数对应的是动态派发。

    Post #15
  • leetcode 和 世界级编程竞赛选手 之间隔得有点远

    Post #4
  • 面就完事了。

    是 qd 还是 qr 啊?

    Post #7 ❤️ 1 like
  • 自动化是这样的,不知道现在还有没有考试手写代码。

    Post #7
  • 建议从 c++ 开始学,虽然 oi 也只需要 C with class and STL

    Post #3
  • 木有。以及你不是美本了吗 🤣

    Post #4
  • 找实习需要 fit 岗位需求的能力和从小实习滚雪球到大实习的时间精力

    Post #10
  • 打了四年 ACM,远没有川川那位打的好,已经退役了。。

    Post #27
  • 太牛了,楼主分享一点经验吧,射射楼主。

    Post #11 ❤️ 1 like
  • 物理系对口的都是啥样的企业啊?

    Post #23
  • 暑假来 acm 小学期玩玩

    Post #147
  • 所以,为什么需要读研呢?先问是不是,再问怎么做。

    Post #80
  • 关于存图的数据结构,本质上可以这么考虑:

    对于单个点的常见操作包括:

    1.判断这点是否和另外一个点连边
    2.枚举这点的连边。

    比如求最短路径算法里面实际上只需要第二种操作即可。

    一张图就是 n 个点的数据结构绑在一起。

    这样考虑的话,可以分成两种,一种是基于桶的方法,用一个大小为 n 的数组标记每个点是否和这个点连边。对应的存图方法就是邻接矩阵。这种方法比较适合第一种操作(O1 复杂度),但是不适合第二种(On)。

    一种是基于线性表的方法,用一个数组或者链表,只记录连边的节点。对应的存图方法就是 vector(邻接数组表),或者链式前向星(本质上是邻接链表,使用预先分配的内存池)。这种方法比较适合第二种操作(Ow 复杂度,w 是连边数量),但是不适合第一种(Ow,同上)。

    理解这个就可以了,甚至可以进行改造,比如把 vector 排序通过二分查找降低第一种操作的复杂度,通过平衡树或者哈希表实现动态删除插入边。

    Post #45 ❤️ 4 likes
  • 大一下就开始刷题啦,后续打算打竞赛?

    Post #43