rknfish

rknfish

i need more love
github

CMU15445 專案 0 Trie_Tree

CMU 15-445

實驗目標#

該實驗為 CMU 15-445/645 的前置實現。主要考察 C++ 使用的功底。

我所採用的課程為 fall20221 相關程式碼可以在 Release2 中下載

該課程主要涉及到兩方面內容

  • 如何搭建環境
  • C++ 的使用
Mermaid Loading...
Mermaid Loading...

環境的搭建#

我採用的是使用虛擬機 (Ubuntu) + 本地電腦 ssh 的開發方式。

vscode 中安裝如下幾個插件

  • C/C++
  • CMake
  • CMake Tools
  • Remote - SSH

首先我們首先需要下載並解壓所需要的 程式碼

wget https://github.com/cmu-db/bustub/archive/refs/tags/v20221128-2022fall.tar.gz
tar -zxvf v20221128-2022fall.tar.gz  

然後直接用 VScode SSH 直接進入遠程的電腦的當前目錄下。

之後安裝必要的軟體

sudo build_support/packages.sh

之後看 Vscode 幾個選項需要我們設置一下

vscod

我們點擊最下方的

生成

image-20231001205625799

然後選擇 Clang 12.01 x86_64-pc-linux-gnu 即可愉快的 coding 了。

Debug#

在生成旁邊有個按鈕 [all] 把他切換為你所需要的那個就可以了。

image

所採用的測試方法為 GTest

只需要將目標 Test 檔案下的 DIABLE_ 刪除就可以進行 Test 了

例如在路徑 /test/primer/starter_trie_test.cpp 將所有 DIABLE_ 刪除,之後就可以嘗試輸出結果,按 就可以在自己打的斷點進行調試。按 就可以直接出結果

調試
Debug "你正在調試"

運行結果
Run "運行程式碼的結果"

C++ 的使用#

這方面到沒有太多可以講的。

主要抓住 std::unique_ptr 的用法就可以了。

下面是幾個個使用的例子。

遍歷字典樹的節點

auto cur_node = &this->root_; // ! 指向智能指針的指針
auto par_node = cur_node;

while(cur_node != nullptr) {
  cur_node = cur_node->get()-> GetChildNode(ch);
  ...
  par_node = cur_node;
}

如何在父類指針上動態構建子類節點

auto tmp_node = std::make_unique<T>(std::move(*cur_node) , value);
par_node-> get() -> InsertChildNode(ch, std::move(*tmp_node));
cur_node = par_node-> GetChildNode(ch);

通過強制轉換得到子類空間的值

auto tmp_node = dynamic_cast<TrieNodeWithValue<T> *>(cur_node->get());

由於課程已經結束了,實在無法完成的話,可以參考我的程式碼

Footnotes#

  1. CMU 15-445/645 fall2022 官方網址 https://15445.courses.cs.cmu.edu/fall2022/

  2. bustub 源碼地址 https://github.com/cmu-db/bustub

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。