Lorsque vous partagez un nœud dans un arbre, vous devriez normalement commencer avec un nœud contenant un vecteur de pointeurs vers ses nœuds enfants. Vous devez ensuite créer un nouveau nœud contenant un vecteur de pointeurs vers ses nœuds enfants que vous avez initialisés avec la moitié des pointeurs enfants du nœud actuel. Ensuite, vous effacez ces pointeurs du nœud actuel - mais vous ne le détruisez certainement pas (même après avoir "donné" la moitié de ses données, il conserve une quantité raisonnable que vous ne voulez pas jeter).
class Node {
// for the moment I'm ignoring the keys, though they'd also be needed for any
// of this to accomplish much.
std:vector<Node *> children;
typedef std::vector<Node *>::iterator child_it;
public:
Node(child_it begin, child_it end) : children(begin, end) {}
Node *split() {
size_t center = children.size()/2;
Node *new_node = new Node(children.begin()+center, children.end());
children.erase(children.begin() + center, children.end());
return new_node;
}
};
Notez que dans C++ 0x, vous auriez probablement à déplacer les pointeurs au lieu de copier détruire ensuite les originaux (mais étant donné qu'ils sont des pointeurs, il ne sera probablement pas faire une réelle différence). Notez également que ceci devrait être exceptionnellement sûr - si l'allocation/l'initialisation du nouveau nœud échoue, le throw
empêchera l'exécution de children.erase
, de sorte que le nœud restera tel qu'il était auparavant. Nous effaçons seulement les pointeurs supplémentaires après que nous ayons assuré que la création du nouveau noeud et la copie de celui-ci a réussi.
Vous ne pouvez pas remplacer un objet scalaire par un ensemble d'objets sur place. Peut-être pouvez-vous prendre du recul et expliquer l'image plus large de ce que vous essayez de faire. –
J'essaie de diviser un nœud dans un arbre, ce qui signifie créer de nouveaux nœuds à sa place qui partagent ses éléments. –