栞忘れてください
FROM THE NOTEBOOK

Project#0

5 min read

环境配置#

由于换到了 Linux 上来,所以就先把环境的配置都解释一下。

首先,官方仓库为 BusTub,根据仓库中的 README 把文件拉到本地(注意需要建立的仓库是 private 而不是 public 的)

接下来就可以进行构建了:

mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Debug -DBUSTUB_SANITIZER=thread ..
make -j`nproc`

关于调试

我这里使用了 VS Code 进行调试(不是不想用 Clion ,而是 Clion 对 STL 的调试不知道为什么解决不了),所以就切换到 vs code 了

对于 vs code 的插件安装:

  1. C/C++
  2. Better C++ Syntax
  3. clangd
  4. CMake, CMake Tools
  5. Git Graph
  6. Github Copilot
  7. Makefile Creator
  8. Todo Tree

具体的配置按照个人喜好来即可

接下来就可以开始进行 launch.json 的编写了,如果对这个有疑问,可以参考 如何在 VScode 中 Debug 中关于 launch.json 的配置

首先我们知道,运行的均为测试,也就是在 build/test 文件夹下的一些可执行文件,所以一个简单的 launch.json 如下:

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "cppdbg",
            "request": "launch",
            "name": "GDB",
            "program": "${workspaceFolder}/build/test/${fileBasenameNoExtension}",
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "MIMode": "gdb",
        }
    ]
}

这样我们需要调试什么文件时,只需要打开文件,按 F5 即可(请注意,是打开 test 文件夹下的文件,而不是 src 中需要你补全的文件)

修改 launch.json 如下:

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "cppdbg",
            "request": "launch",
            "name": "GDB",
            "program": "${workspaceFolder}/build/test/${fileBasenameNoExtension}",
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "setupCommands": [
                {
                    "description": "Text",
                    "text": "python import sys;sys.path.insert(0, '/usr/share/gcc-12.2.1/python');from libstdcxx.v6.printers import register_libstdcxx_printers;register_libstdcxx_printers(None)",
                    "ignoreFailures": false
                },
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "MIMode": "gdb",
        }
    ]
}

注意 text 中 /usr/share/gcc-12.2.1 这里,需要根据自己电脑的 gcc 版本号来填写

实验过程#

这里解释一下实验的一些坑点

涉及到需要修改的文件:

image-20230524151303791

TASK#1#

  1. 智能指针的使用,可以询问 GPT 解决
  2. 建议的实验过程为:
    1. 首先实现一个正常版本的字典树(即不考虑 COW ,正常增删改查)
    2. 考虑 COW 的实现,我们只需要修改插入与删除的部分即可
    3. 对于插入部分,显然,当一个节点存在时,我们需要去克隆这个节点,然后插入到新树上(注意我们每次在一开始都会克隆 root_ 节点,这样就变成了一颗新树),否则我们只是新建一个节点并插入
    4. 对于删除部分,显然,我们在遍历 key 时,若能找到子节点,那么我们才需要去克隆,否则直接抛出 Key not Found 异常即可,在遍历到 key 的最后一个字符时,我们需要特判这个节点是否为叶子节点,如果是的话,直接释放(意思是我们的新树中没有这个节点了),否则我们需要克隆这个节点。

TASK#2#

并发处理,注意加锁的顺序

  1. 对于 Get 而言,在取数据时需要加 root 锁
  2. 对于 Put 与 Remove 而言,在一开始我们就需要加上 write 锁,在更新树的根节点时,我们需要加上 root 锁

TASK#3#

debug 技巧,在 trie_debug_test.cpp 中打上端点,并调试,可以在 gdb 中查看对应的答案,当然你也可以使用 cout 来得出答案

TASK#4#

文件的搜索可以使用 <C-p> 输入文件名可以搜索找到对应的文件

string_expression.h 中,添加 upper 和 lower 函数,这两个函数的含义是,将传入的字符串根据对应的选项,全部转为大写或小写

plan_func_call.cpp 中,添加函数的定义,这里其实有点类似 RPC 调用?首先判断函数的名称,然后根据函数名称选择对应选项(转为大写还是小写),判断参数的个数,最后传入参数

实验提交#

cd build
make submit-p0

在 gradescope 上提交 project0-submission.zip ,等待评测,我的评测如图:

image-20230524151145553

CONVERSATION

讨论

想法、补充,或只是打个招呼。

← 返回文章
关系图谱 ↓

全局关系图谱

页面标签
笔记
↑ ↓ 选择↵ 打开Esc 关闭