CMU 15445 spring - project 0 C++ Primer实验笔记

发布时间 2023-08-01 21:47:21作者: 1v7w

前排提醒

本项目需要在linux/mac环境下进行开发,如果是windows最好是整个linux的环境,比如云服务器、虚拟机、wsl等。

整个课程需要仔细看文档,包括bustub的readme,每篇project的描述。

整个课程需要仔细看文档,包括bustub的readme,每篇project的描述。

整个课程需要仔细看文档,包括bustub的readme,每篇project的描述。

项目大意

image

本项目分为4个部分:

  1. 写一个写时复制的字典树
  2. 写一个多线程字典树(在1基础上)
  3. 测试debug能力
  4. 写一个bustub数据库的聚合函数

难度大概是1最难,2次之,其余都很简单。

对我而言1最难是因为语法不熟悉,本项目使用的是c++17的语法,不过只要熟悉c++11就能顺畅写下来了。

多线程难写主要是并发炸了image

提醒,改了代码文件但没改测试代码文件时候,也需要指定测试目标重新生成

Task #1 - Copy-On-Write Trie

这个任务要求实现Get、Put、Remove方法。

Get的话要判断key是否为空,为空那就是root为value节点。遍历的时候map不要用[],也不要用at来判断是否存在这个键值对(算竞人只会[]),因为函数是const的。还要记得判断root是否为空。

Put比起Get来就比较难一点。首先也需要判断root是否为空。为空就好说了,如果不为空的话,那么遍历一路,一路上都是需要创建新的节点的。特判key最后一个字符对应的节点是否存在,存在的话就copy-on-write,不存在就直接new(不是直接new)。

Remove的时候,过程就类似于递归了。首先跟着key找到对应的路径,接着从底部往上copy-on-write。我是写了一个lambda递归,返回是否要删除子节点以及子节点的指针。

Task #2 - Concurrent Key-Value Store

这个如果之前有接触过多线程的话很好写,只要看清楚题意想明白怎么写就行。

我之前我想明白上“多人可读,一人可写”。弄成了多个人拿取那份数据后,分写改写后,仅一人可写回,这样就不对的。应该是写的时候,仅其中一人在进行写的整个过程,其他的写者都应该等着。

Task #3 - Debugging

这个很简单,熟悉一下debug操作就行。

记得答案写到 src/include/primer/trie_answer.h 不要写错位置了。

Task #4 - SQL String Functions

这个任务可以帮助熟悉项目结构。

string_expression.h 写出来具体的执行方法。在 plan_func_call.cpp 写调用逻辑。

结语

整个课程需要仔细看文档,包括bustub的readme,每篇project的描述。

要用linux/mac系统来运行项目。

其实早在三四月份就想上手写这个,但当时语法知识欠缺,无从下手。在经过一段时间的学习,以及实习经历对编程技术的增长,还有和其他前辈的交流,让之前觉得很难的cmu15445变得一般难了。终于有了资格去上这门课了2333.