1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| #include <iostream>
#include <vector>
#include <memory>
template <typename T>
class Node{
public:
/* quelques alias de type intéressants pour la facilité */
using value_t = T;
using node_t = Node<T>;
private:
/* ces alias ci sont à usage interne uniquement ... */
using children_t = std::vector<node_t>;
public:
/* mais ceux ci seront utilisable depuis l'extérieur */
using const_iterator_t = typename children_t::const_iterator;
using iterator_t = typename children_t::iterator;
Node(value_t v):value_(v){
}
/* ajouter une valeur, plutôt qu'un noeud, ca sera beaucoup plus facile ;)
*/
void addChild(value_t /* const &*/ v){
children_.emplace_back(node_t(v));
}
/* ce que l'on compare, c'est la valeur de chaque noeud */
friend
bool operator == (node_t const & lhs, node_t const & rhs){
return lhs.value_ == rhs.value_;
}
const_iterator_t begin() const{
return children_.begin();
}
const_iterator_t end() const{
return children_.end();
}
size_t childCount() const{
return children_.size();
}
value_t const & value() const{
return value_;
}
/* un sucre syntaxique équivalent à la fonction value */
value_t const & operator *() const{
return value_;
}
/* on peut vouloir interchanger deux noeuds */
void swap(node_t & other){
std::swap(value_, other.value_);
std::swap(children_,other.children_);
}
/* on n'a même plus besoin de la fonction clone, le constructeur de copie et
* l'opérateur d'affectation implémentés automatiquement par le compilateur
* font très bien leur boulot
*/
private:
value_t value_;
children_t children_;
};
using node = Node<int>;
int main(){
node n(1);
n.addChild(2);
n.addChild(3);
n.addChild(4);
std::cout<<n.childCount();
for (auto const & it :n){
std::cout<< *(it)<<"\n";
/* revient au meme que */
std::cout<<it.value()<<"\n";
}
return 0;
} |
Partager