La fin de la fin ne peut pas être nullptr
si votre itérateur est bidirectionnel, end()--
doit être légale.
Il peut être implémenté à la place par une sentinelle, et dans ce cas, la sentinelle ne devrait même pas contenir un élément construit par défaut.
Cela peut être fait en tant que telle
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) {}
// ...
};
Et itérateurs ont pas besoin d'un traitement spécial pour le cas passé final.
// 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}; }
Le placement nouveau peut vous épargner la construction prématurée ... juste dire – StoryTeller
Passé les éléments d'extrémité ne sont pas censés exister. – nwp
Quand vous dites passé-le-dernier élément, vous voulez peut-être dire un élément 'end', qui pour les tableaux bruts peut être un pointeur vers un passé le dernier élément, mais n'est pas obligé d'être. Vous pouvez faire un type de sentinelle pour représenter 'end' à la place. – AndyG