这里就是需要实现迭代器的一些操作,比如begin、end、isend等等

下面是对于IndexIterator的构造函数

  1. template <typename KeyType, typename ValueType, typename KeyComparator>
  2. IndexIterator<KeyType, ValueType, KeyComparator>::
  3. IndexIterator(BPlusTreeLeafPage<KeyType, ValueType, KeyComparator> *leaf,
  4. int index_, BufferPoolManager *buff_pool_manager):
  5. leaf_(leaf), index_(index_), buff_pool_manager_(buff_pool_manager) {}
  1. 利用key值找到叶子结点
  2. 然后获取当前key值的index就是begin的位置
  1. INDEX_TEMPLATE_ARGUMENTS
  2. INDEXITERATOR_TYPE BPLUSTREE_TYPE::Begin(const KeyType &key) {
  3. auto leaf = reinterpret_cast<BPlusTreeLeafPage<KeyType, ValueType,KeyComparator> *>(FindLeafPage(key, false));
  4. int index = 0;
  5. if (leaf != nullptr) {
  6. index = leaf->KeyIndex(key, comparator_);
  7. }
  8. return IndexIterator<KeyType, ValueType, KeyComparator>(leaf, index, buffer_pool_manager_);
  9. }
  1. 找到最开始的结点
  2. 然后一直向后遍历直到nextPageId=-1结束
  3. 这里注意需要重载!===

end函数

  1. INDEX_TEMPLATE_ARGUMENTS
  2. INDEXITERATOR_TYPE BPLUSTREE_TYPE::end() {
  3. KeyType key{};
  4. auto leaf= reinterpret_cast<BPlusTreeLeafPage<KeyType, ValueType,KeyComparator> *>( FindLeafPage(key, true));
  5. page_id_t new_page;
  6. while(leaf->GetNextPageId()!=INVALID_PAGE_ID){
  7. new_page=leaf->GetNextPageId();
  8. leaf=reinterpret_cast<BPlusTreeLeafPage<KeyType, ValueType,KeyComparator> *>(buffer_pool_manager_->FetchPage(new_page));
  9. }
  10. buffer_pool_manager_->UnpinPage(new_page,false);
  11. return IndexIterator<KeyType, ValueType, KeyComparator>(leaf, leaf->GetSize(), buffer_pool_manager_);
  12. }

==和 !=函数

  1. bool operator==(const IndexIterator &itr) const {
  2. return this->index_==itr.index_&&this->leaf_==itr.leaf_;
  3. }
  4. bool operator!=(const IndexIterator &itr) const {
  5. return !this->operator==(itr);
  6. }
  1. 重载++

简单的index++然后设置nextPageId即可

  1. template <typename KeyType, typename ValueType, typename KeyComparator>
  2. IndexIterator<KeyType, ValueType, KeyComparator> &IndexIterator<KeyType, ValueType, KeyComparator>::
  3. operator++() {
  4. //
  5. // std::cout<<"++"<<std::endl;
  6. ++index_;
  7. if (index_ == leaf_->GetSize() && leaf_->GetNextPageId() != INVALID_PAGE_ID) {
  8. // first unpin leaf_, then get the next leaf
  9. page_id_t next_page_id = leaf_->GetNextPageId();
  10. auto *page = buff_pool_manager_->FetchPage(next_page_id);
  11. if (page == nullptr) {
  12. throw Exception("all page are pinned while IndexIterator(operator++)");
  13. }
  14. // first acquire next page, then release previous page
  15. page->RLatch();
  16. buff_pool_manager_->FetchPage(leaf_->GetPageId())->RUnlatch();
  17. buff_pool_manager_->UnpinPage(leaf_->GetPageId(), false);
  18. buff_pool_manager_->UnpinPage(leaf_->GetPageId(), false);
  19. auto next_leaf =reinterpret_cast<BPlusTreeLeafPage<KeyType, ValueType,KeyComparator> *>(page->GetData());
  20. assert(next_leaf->IsLeafPage());
  21. index_ = 0;
  22. leaf_ = next_leaf;
  23. }
  24. return *this;
  25. };
  1. 重载*

return array[index]即可

  1. template <typename KeyType, typename ValueType, typename KeyComparator>
  2. const MappingType &IndexIterator<KeyType, ValueType, KeyComparator>::
  3. operator*() {
  4. if (isEnd()) {
  5. throw "IndexIterator: out of range";
  6. }
  7. return leaf_->GetItem(index_);
  8. }
版权声明:本文为JayL-zxl原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/JayL-zxl/p/14333395.html