Lab 4.4 TwoMergeIterator

1 概述

根据上一节Lab 4.3 ConcactIterator中对TwoMergeIterator的介绍, TwoMergeIterator就是整合两个优先级不同的迭代器, 生成一个新的迭代器, 该迭代器优先级为两个迭代器中优先级较高的那个。

其余逻辑上一节Lab 4.3 ConcactIterator已经有所介绍, 这里不再赘述, 直接开始看头文件定义:

class TwoMergeIterator : public BaseIterator {
private:
  std::shared_ptr<BaseIterator> it_a;
  std::shared_ptr<BaseIterator> it_b;
  bool choose_a = false;
  mutable std::shared_ptr<value_type> current; // 用于存储当前元素
  uint64_t max_tranc_id_ = 0;
};

这里也很简单, 就只是存储两个迭代器 的指针it_ait_b, 以及一个choose_a用于标记当前是否选择了优先级较高的it_a迭代器是, 一个current用于缓存当前迭代器位置的键值对, 一个max_tranc_id_用于记录当前可见事务的最大id

2 代码实现

2.1 运算符重载

BaseIterator &TwoMergeIterator::operator++() {
  // TODO: Lab 4.4: 实现 ++ 重载
}

bool TwoMergeIterator::operator==(const BaseIterator &other) const {
  // TODO: Lab 4.4: 实现 == 重载
  return false;
}

bool TwoMergeIterator::operator!=(const BaseIterator &other) const {
  // TODO: Lab 4.4: 实现 != 重载
  return false;
}

BaseIterator::value_type TwoMergeIterator::operator*() const {
  // TODO: Lab 4.4: 实现 * 重载
  return {};
}

TwoMergeIterator::pointer TwoMergeIterator::operator->() const {
  // TODO: Lab 4.4: 实现 -> 重载
  return nullptr;
}

老套路, 你需要先实现迭代器的各个运算符重载函数, 不过建议你看看下面的辅助函数, 你在实现这些运算符重载函数的时候会用到这些辅助函数, 不妨一起实现了。

2.2 辅助函数

首先choose_it_a判断当前解引用应该使用哪个迭代器:

bool TwoMergeIterator::choose_it_a() {
  // TODO: Lab 4.4: 实现选择迭代器的逻辑
  return false;
}

然后是更新当前缓存值的函数:

void TwoMergeIterator::update_current() const {
  // TODO: Lab 4.4: 实现更新缓存键值对的辅助函数
}

这个函数你可能会在之前的自增运算符和->运算符重载中调用

最后这个函数是根据事务可见性进行滤除的辅助函数, 当前不需要实现, 只是标记下便于你之后的Lab来更新:

void TwoMergeIterator::skip_by_tranc_id() {
  // TODO: Lab xx
}

3 测试

本小节没有测试, 你完成后续迭代器和涉及迭代器的查询操作后有统一的单元测试。