CMU15-445(2)Project 0
主要记录一些注意事项
关于第一次运行项目的一些坑
本地测试都使用了DISABLE标记,需要加上参数--gtest_also_run_disabled_tests
才能运行测试用例,一种方便的解决方法是这样配置launch.json
文件
1 | { |
另外,CMake的生成目标中,不能选择ALL,因为测试文件都被手动排除出了ALL,可以选择build-tests
或者单独选择当前要启动的测试。
还有生成器建议选择Ninja Multi-Config
,这样在切换Debug和Release时不需要重复编译,在执行对应指令如打包源文件时只需要把make
换成ninja
即可。
关于C++的一些坑
std::bitset
在用数字进行初始化时使用小端序,下标0对应最低位,因此在计算最高位1时下标应从大往小变化。
关于测试的一些坑
在初始化时需要进行检查n_bits
是否为负数,是负数就不做任何事,否则边界测试过不了。
提交前建议先本地运行check-clang-tidy进行检查,这是很容易被忽视的一点,CMU15-445的clang-tidy开启了较多的检查,很容易过不了。
关于Task
Task1没什么好说的,比较简单,主要是Task2,我开始一直没懂什么意思~~(因为我感觉这个溢出额外开桶的操作非常意义不明,有必要省这点内存吗)~~,最后才发现就是把本来的值分成两部分存,低4位存在初始的桶里,如果有高3位就放在哈希表中,计算时再合并处理。建议是单独写个辅助函数计算一个index对应的值,因为在插入时需要和总的值比较大小,不能像Task1一样直接跟数组里的值取个max。
至于取前几位后几位,个人感觉直接用数字更方便,不知道为什么要转成bitset,最高位1用std::__lg
(C++20可以用std::bit_width
,但是不建议升级C++标准,编译会报一堆错,主要是跟模板相关,新的C++标准对模板的一些东西有了更严格的限制),最低位1用lowbit(x & -x)
,都很方便。