CMU15445(2023 Spring) - Project 0. C++ Primer

系列笔记

环境配置
Project 0. C++ Primer
Project 1. Buffer Pool
Project 2. B+Tree

作业链接

作业链接(2020,废)
作业链接
p0就是一个C++水平测试,很简单 2023的明显难不少。

TASK 1

先简单说一下看到这个数据结构时自己想到的一些问题与自己的思考:

  1. 为啥Put的实现这么奇葩,要求返回一颗新树,不会很耗资源吗?
    显而易见Put是比较耗资源的,但是没有想象中的那么耗资源,因为Trie其实不负责具体资源的分配的,Trie代表的仅仅是一些索引而已,里面只存了一堆指针。
  2. 为啥Get的实现要求先dynamic_cast到const TrieNodeWithValue<T>*,不嫌麻烦吗?*
    这其实是为了实现异类集合,想想就知道了。

Get

Get实现没啥难度,直接扫一遍key指针跟着跑就行,唯一一个小坑点是root_是个shared_ptr,不能直接做cast到裸指针,需要通过.get获取裸指针然后再做cast。

Put

Put实现开始就有点麻烦了,这个题目的主要问题是想要修改一棵树,根据题目要求,这个Put是要返回一颗新Trie的,拿官方例子中的添加[“ad”, 2]为例,如果我们自顶向下构造new trie,首先建立new root,然后我们在new root里添加一个[‘a’, Node2],然后在Node2里添加一个[‘d’, 2],这一步就卡住了——我们在root里存的node2的指针是指const的,加不了!

在这里插入图片描述
想清楚这一点就很好解决了,我们就自底向上构建树,先从头到尾扫一遍key,公共结点一路clone下来,非公共结点新建资源,存到栈里,然后使用最后的那个结点的child与函数参数value构造一个TrieNodeWithValue,再反向遍历key并依次弹出stack,利用map::operator[]建立一颗树即可。

Remove

Remove也就差不多的操作,首先扫一遍key,如果发现key不在Trie里或者key对应的结点压根没value,直接返回root无事发生,否则的话就入栈,然后用最后遍历到的那个结点的children去构造一个TrieNode并修改栈顶,然后依此出栈并erase掉children为empty的结点。

Task 2

没啥好说的,照着伪代码写就行,只要Task1没问题,Task2就不会有太大问题,记得写Put的时候别忘了move传value就行。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
CMU 15445 课程的 Project 0 是一个调试练习,旨在帮助学生熟悉调试工具和技术。在这个项目中,你将开始使用 GDB 和 Valgrind 这两个常用的调试工具,以及一些其他辅助工具。以下是一些问题和步骤,帮助你完成这个练习: 1. 你需要查看项目中提供的代码,并了解它的结构和功能,这样你才能更好地理解程序的逻辑和可能出现的 bug。 2. 接下来,你需要编译项目,并确保没有编译错误。如果出现错误,你需要修复它们,这可能需要检查一些语法错误或缺失的库。 3. 一旦成功编译项目,你就可以使用 GDB 进行调试了。GDB 是一个强大的调试器,可以帮助你找出程序中的错误。你可以使用 GDB 来单步执行代码、设置断点、查看变量的值等等。通过使用 GDB,你可以逐步查看代码运行的路径,并找出程序崩溃或产生错误的原因。 4. 在使用 GDB 进行调试时,你可以通过设置断点来暂停程序的执行,并查看变量的值和程序的状态。你可以使用“break”命令在程序中设置断点,并通过“run”命令启动程序。当程序到达这个断点时,它会停止执行,你可以使用“print”命令查看变量的值,或者“step”命令逐步执行代码。 5. 另一个常用的调试工具是 Valgrind。Valgrind 可以帮助你检测内存泄漏和错误的访问方式。你可以使用“valgrind”命令来运行程序,并查看 Valgrind 的输出。它会告诉你有关程序中任何潜在问题的信息,例如未初始化的变量、访问越界等。 6. 最后,当你发现 bug 并修复它们后,可以运行各种测试用例来验证程序的正确性。测试用例可以帮助你确定程序是否按预期工作,并且在修改代码后,它们可以帮助你确保你的修复没有引入新的错误。 通过完成 CMU 15445 项目 0 的调试练习,你将掌握一些重要的调试技巧和工具,这对于进一步开发和调试软件应用程序将非常有用。希望上述步骤和建议对你有所帮助,祝你顺利完成这个项目!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值