CMU-DB Lab
2023-01-10 23:54:11

Intro

学校里的数据库实在是讲得太烂了,是听了十分钟就会想激情退课的水准

cmu这个感觉就 andy 比较有激情,21年代课的老师也比较闷

听说这个 lab 很牛逼(jyy和qlg强力推荐),于是做一做

我做的是2022fall的版本,这个评分的网站 gradescope 似乎没法注册,所以能通过本地测试就是胜利!

Lab0-Trie

看说明 lab0 是用来劝退的,大概是要你写一个支持并发的字典树

实测并发是个酱油,一把大锁就能解决了,然后读写锁也都给了你...

比较关键的点就是 TrieNodeWithValue 继承了 TrieNode,然后有一个构造函数是 TrieNodeWithValue(TrieNode &&other, T Value) 用于 consume 一个普通节点,构造出一个带 value 的节点。插入的时候,节点类型的转换我是通过先删除后添加的方法做的...

以及一个之前没注意过的点是这样的:make_unique<T>(ARGS) 的参数 ARGS 将被用于构造 T 而不是作为 unique_ptr 的内容。这也意味着 make_unique<T>() 只能创造指向 T 的指针。

而如果想要实现多态的话,我们得这么做 unique_ptr(new T()),这样用一个裸指针来初始化。下面是一个我附会了的例子

class Base { public: virtual ~Base() = default; /* other stuff*/ };
class Derived : public Base { /* other stuff */ };

int main() {
    auto p1 = std::unique_ptr<Base>(new Derived());
    auto p2 = std::make_unique<Base>(Derived());
    
    std::cout << dynamic_cast<Derived *>(p1.get()) << std::endl;
    std::cout << dynamic_cast<Derived *>(p2.get()) << std::endl;
}

这里第一个是正常的指针,第二个是 nullptr。这是因为

std::make_unique<Base>(Derived())

等价于

std::unique_ptr<Base>(new Base(Derived()))

然后这里又有一个子类型的转换,于是

std::unique_ptr<Base>(new Base((Base)Derived()))

c++还真是神奇啊