超过非默认可构造元素的最后一个元素

Past-the-last element for non default-constructible elements

本文关键字:元素 最后一个 默认      更新时间:2023-10-16

在使用类似STL接口的树类时,我遇到了一个使用非默认可构造元素的问题:

在实现迭代器的过程中,我需要在任何时间点都有一个超过最后一个元素。我的方法是在构造函数中创建一个,它断言值类型为默认可构造类型。

有没有办法摆脱这种限制?

如果迭代器是双向的,则指向末尾不可能是nullptrend()--需要合法。

它可以由sentinel实现,在这种情况下,sentinel甚至不应该包含默认构造的元素。

这可以作为来完成

struct link
{
link *parent, *left, *right;
};
template<typename T>
struct node : link
{
T data;
};
template<typename T>
struct tree : link
{
// tree itself serves as the sentinel
// At initialization parent and childs should all point to the sentinel
tree() : parent(this), left(this), right(this) {}
// ...
};

迭代器不需要对一个超过末尾的情况进行特殊处理。

// nested within tree
struct iterator
{
explicit iterator(link* l) : n(l) {}
iterator& operator--() { n = n->parent; return *this; }  // or something else
auto& operator*() { return reinterpret_cast<node<T>*>(n)->data; }
// ...
link* n;
};
iterator begin() { return {left}; } // or something else
iterator end() { return {this}; }

我通过存储另一个指向根节点的指针来解决这个问题,从中我可以在恒定时间内重新创建最后一个元素。