cs144 checkpoint0
问题 1:
bytestream
使用什么数据结构?
- 原始想法: 使用环形队列,因为容量是固定的,使用环形队列的两头,一头读,一头写,而且还是原地算法,真的很不错。最大的缺点是: index 不好确定,尾可能在头的前面,不好计算。刚开始没弄明白 peek() 函数是干嘛的,还觉得是环形队列的问题,很难评,有时间把这种实现一下。
- 第二想法: 使用
vector
,使用 vector 不能从头部删除,需要自己手动维护。从这里开始从循环队列原地算法的圈套中走出来了,可以不只是用那一块内存,只要容量固定就行。可是我还是很古板,还是觉得这样应该会浪费内存。 - 第三想法:使用
deque
,使用deque
的pop_front()
函数,可以把头部数据删除,而且deque
只从第一个有效位开始算头部,不会算之前pop
出去的数据,这就很符合要求。
问题 2:
string_view
是什么?peek()
函数返回的 string_view
到底是哪一个?
- 原始想法:
peek()
返回的是当前buffer
的视图,所以我就把deque
中的元素全都拷贝到 string 当中,然后从string
中生成string_view
,所以在运行测例的时候,我不出意外的遇到了栈上内存在返回时未释放的错误。 - 第二想法:实在想不出来了,去 github 上看一个小哥,他的逻辑是
peek()
返回的是上一个push
进的字符串的视图。按照这种思路去实现就很麻烦,因为要单独维护一个队列记录每一次push
进来的字符串的视图。而且pop
的时候又不是按照这个push
进的字符串的粒度,所以pop
操作的时候贼麻烦,而且我真的不清楚维护这样的视图有什么作用。于是我的直觉不是这样的。 - 第三想法:看了一下 hint,然后感觉应该是
buffer
中下一个字符的视图,感觉这样就比较简单了。并且更加符合平时的直觉。