Sto facendo un albero (essenzialmente un albero prefisso, ma per i numeri non stringhe), che è costruito dalla lista ordinata di tuple di numeri ((1,1,2), (1,2,5), (2, 1,0) ecc ...), ciascuno associato a un singolo valore scalare (int o doppio molto probabilmente). Dato che è costruito solo una volta e poi ripetuto/cercato più volte, ho intenzione di usare std :: vectors per contenere i figli di ogni nodo. Per cercare l'albero, ho solo bisogno di chiamare std :: lower_bound per fare una ricerca binaria sul vettore _children di ogni nodo, che conterrà std :: pairs di ciascun nodo e la rispettiva chiave. Tuttavia, i nodi inferiori devono contenere un vettore con coppie costituite dall'ultima voce in ciascuna tupla e i rispettivi valori e, pertanto, devono essere di un tipo diverso rispetto a BranchNode. Il codice è simile al seguente:C++: classi separate per nodi di ramo e foglia?
class GenNode
{
};
template<typename key_type,typename value_type>
class BranchNode : GenNode
{
void insert(std::pair< std::vector<key_type> , value_type>);
private:
std::vector< std::pair<key_type,GenNode*> > _children;
};
template<typename key_type,typename value_type>
class LeafNode : GenNode
{
private:
std::vector< std::pair<key_type,value_type> > _children;
};
Tuttavia, questo è davvero brutta, perché entrambe le classi devono ereditano dalla classe GenNode inutile in modo che i figli di ogni BranchNode possono essere sia altri BranchNodes o LeafNodes ... c'è un modo migliore per farlo?
Un 'Nodo' è una foglia fino a quando non ha aggiunto sub-nodi, quindi è un ramo. Basta avere oggetti 'Node'. –
Non voglio farlo per ragioni di efficienza; Non voglio che i nodi foglia abbiano i vettori _children vuoti, che presumibilmente conservano una "dimensione = 0" e altri membri simili –
C'è una discussione sui meriti delle diverse implementazioni degli alberi nella sezione commenti di questo post del blog: http : //math.andrej.com/2009/04/11/on-programming-language-design/ – Heatsink