带并列规则的比较器
补全排序的比较器:分数高的在前,同分按名字字典序从小到大。输出排好后的名字,用逗号隔开。 (本题用 g++ -std=c++17 -O0 编译。)
词频统计太慢
场景:一个词频统计程序在几百个词上表现正常。线上一次要统计十几万个词,它跑了十秒都没出结果。 任务:改 ~/work/freq/freq.cpp 的统计方式,让约 12 万个单词在 2 秒内出结果,输出格式和排序规则一字不变。用 g++ -
比较器写错了
场景:一个排名程序的结果里,同分的人顺序每次都不一样,数据多的时候偶尔还会崩。排序那一行看上去平平无奇。 任务:修好 ~/work/rank/rank.cpp 的比较器:分数从高到低,同分按名字字典序从小到大。编译成 ~/work/rank
抛异常时谁会被释放
中途抛出异常,作用域照样结束 抛出 作用域一结束,里面的对象自动析构 函数执行到一半抛出异常时,由【0】管理的对象一定会被释放。
搬家时用移动
想让 vector 扩容搬家时用移动而不是拷贝,元素类型的移动构造函数应该【0】。
把拷贝降到零
Big 每被拷贝一次计数加一。改两个函数的参数,让它们不再拷贝(结果不变)。输出 结果/拷贝次数。 (本题用 g++ -std=c++17 -O0 编译。)
异常路径上漏掉的对象
场景:一个处理命令的程序遇到坏行会抛异常、由 main 统一计数。程序结束时打印的存活对象数本应是 0,可只要有坏行它就不是。 任务:用 RAII 改写 ~/work/raii/raii.cpp 里的 process():不再出现裸 new
把拷贝次数降到零
场景:一个处理大对象的程序最后会打印 copies=N。每一次拷贝都是一整块内存的复制,N 越大越慢。 任务:改 ~/work/move/move.cpp,不改第一行输出,把 Blob 的拷贝次数降到 0。编译成 ~/work/move/m
长长的模板报错
模板相关的编译错误往往有几十行。要找自己代码里出问题的位置,最该看的是【0】那一行。
少了比较运算
模板函数里写了 a < b,传进来的类型却没有 operator<,报错发生在【0】。