I'm implementing a bidirectional iterator of my B-Tree implementation. (Full code: https://wandbox.org/permlink/i4UeEvE3OB6mVup3)
In short, I'm stuck in reversing the direction.
Node implementation:
class Node {
std::size_t n = 0;
bool leaf = true;
Node* parent = nullptr;
std::size_t index = 0;
std::vector<T> key;
std::vector<std::unique_ptr<Node>> child;
// details ...
};
My correct forward iterator implementation:
class BTreeIterator {
using difference_type = std::ptrdiff_t;
using value_type = T;
using pointer = T*;
using reference = T&;
// using iterator_category = std::bidirectional_iterator_tag;
using iterator_category = std::forward_iterator_tag;
Node* node;
std::vector<T>::iterator it;
void Increment() {
if (it == node->key.end()) {
return;
}
if (node->leaf) {
++it;
while (node->parent && it == node->key.end()) {
it = node->parent->key.begin() + node->index;
node = node->parent;
}
} else {
auto i = std::distance(node->key.begin(), it);
node = node->child[i + 1]->LeftmostLeaf();
it = node->key.begin();
}
}
public:
BTreeIterator(Node* node, std::size_t i) : node {node} {
assert(node && i <= node->key.size());
it = node->key.begin() + i;
}
reference operator*() const {
return *it;
}
pointer operator->() const {
return it;
}
BTreeIterator& operator++() {
Increment();
return *this;
}
BTreeIterator operator++(int) {
BTreeIterator temp = *this;
Increment();
return temp;
}
friend bool operator==(const BTreeIterator& x, const BTreeIterator& y) {
return x.node == y.node && x.it == y.it;
}
friend bool operator!=(const BTreeIterator& x, const BTreeIterator& y) {
return !(x == y);
}
};
My failed attempt to implement operator--
:
// ...
void Decrement() {
if (it == node->key.rend()) {
return;
}
if (node->leaf) {
--it;
while (node->parent && it == node->key.rend()) {
it = node->parent->key.rbegin() + (node->getN() - node->index);
node = node->parent;
}
} else {
auto i = std::distance(node->key.rbegin(), it);
node = node->child[getN() - i - 1]->RightmostLeaf();
it = node->key.rbegin();
}
}
// ...
BTreeIterator& operator--() {
Decrement();
return *this;
}
BTreeIterator operator--(int) {
BTreeIterator temp = *this;
Decrement();
return temp;
}
Because it
is std::vector<T>::iterator
, it fails to assign .rbegin()
or .rend()
of std::vector<T>
, which is std::vector<T>::reverse_iterator
.
Is there any way to get the address of pointer of std::vector<T>::reverse_iterator
to make a std::vector<T>::iterator
? I really need "before-one-the-begin" address to make ease Decrement()
implementation.