使用类似STL的接口处理树类时,我遇到了使用非默认可构造元素的问题:
当我实现迭代器时,我需要在任何时间点都有一个过去的最后一个元素。我的方法是在构造函数中创建一个,它将值类型断言为默认可构造。
有没有办法摆脱这种限制?
答案 0 :(得分:2)
如果您的迭代器是双向的,那么指向结束可能是end()--
,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}; }
迭代器在最终案例之后不需要特殊处理。
None
答案 1 :(得分:0)
我通过存储另一个指向根节点的指针解决了这个问题,我可以从中重新创建最后一个元素。