记录我的第一段实习
Re:从零开始的实习之旅
转眼间到了厦门的盛夏,期末考试结束了,我决定专心找实习。我留在了厦门。希望能在实习期间学到更多的知识和技能,为将来的职业发展打下坚实的基础。
实习第一天进入公司,上午主要先办理入职,然后拿起上一位实习生配置好的 c++ 代码就看。
Python,启动!
今天装了Pycharm、anaconda、Pytorch,跑机器学习模型案例。Pycharm和anaconda的配置还挺熟悉的,anaconda之前卸了装、装了卸的。Pytorch要装GPU版的,也是装过。机器学习也能跑,怎么调参还是要好好学习原理呢。
ollama 本地部署大模型帮助数据分类
很好,我装了个ollama,试了一下效果还不错。用的是qwen3:8b-q4_K_M模型,似乎跑的有点慢,就换成了qwen3:4b-q4_K_M。快了一点点。操作挺傻瓜的,下载安装一气呵成,然后下载模型也很快。直接在命令行里输入
1 | ollama pull qwen3:4b-q4_K_M |

效果还不错!
望着奇奇怪怪的计算几何算法,我一筹莫展。考虑的特殊情况和问题太多了!机器学习倒是能跑。导师让我做个小汇报,我自己快把自己说糊涂了。后面我可能要碰一点点前后端,自己跑成功了再留下文档。
C++ 未定义行为打赏
今天写 c++,主要把之前写的几乎没法维护的代码,简化一下。之前完全按照大牛的论文来复现了,伪代码变成真代码太难了。然而,简化却出现了更多的问题。
比较键导致优先队列出现未定义行为
虽然std::set的比较键comp,当comp(a,b)和comp(b,a)都返回false时,a和b视为一样的值,不重复插入,但是,std::set的comp(a,b)和comp(b,a)不能都返回false,否则会出现诡计多端的未定义行为。这还是我自己的逻辑问题,不会报错,糟糕极了。
无论是 comp(a, b) 和 comp(b, a) 都返回 false,还是都返回 true,都破坏了优先队列依赖的严格弱序关系,会导致未定义行为。
比较器必须同时满足:
- 非自反性:
comp(a, a)必须为false。 - 非对称性:如果
comp(a, b)为true,则comp(b, a)必须为false。 - 传递性:如果
comp(a, b)为true且comp(b, c)为true,则comp(a, c)必须为true。
| 比较场景 | 合规结果 (满足严格弱序) | 违规情况一 | 违规情况二 |
|---|---|---|---|
comp(a, b) |
true (表示 a < b) |
false |
true |
comp(b, a) |
false |
false |
true |
| 对严格弱序的违反 | - | 违反完备性(无法确定a和b的关系) | 违反非对称性(a<b和b<a同时成立) |
| 对优先队列的影响 | 正常构建堆结构 | 元素关系不确定,堆结构可能错乱 | 堆结构的逻辑基础完全崩塌 |
对于整数等基本类型,最安全的方法是使用标准库提供的比较函数对象(如 std::less)或避免使用可能产生歧义的自定义比较逻辑。对于自定义类型,可以使用 std::tie 来构造可靠的比较器。
我犯的错误是双false,有的时候它正常排序了,有的时候第一个元素的一个重要值给我替换成了一个接近零的浮点数?十分诡异。而且一开始我优先队列里还装指针,雪上加霜了
迭代器加指针是画蛇添足
迭代器已经很智能了,外部再记录不需要再使用“迭代器指针”了。
相当于stl已经帮你封装好了优化的迭代器。迭代器对象生命周期与所属的对象自然绑定,迭代器对象本身也不大。我却没事干搞了个双重指针,一个erase还没有delete,一不小心就把堆给破坏掉了,弊远大于利。
std::vector可能导致原来的内存失效
我将指针指向了std::vector里装的东西,因为push_back扩容时,需要新开辟一块空间再复制进去,原空间废弃无主,所以原来的指针就变成了不美味的野生指针。std::list作为权宜之计,可以规避这个问题,但也要小心指针。
