Salut les gars !!
je suis en train de faire une classe dérivée qui a pour but de faire une liste d'adjacence à partir de la structure d'un arbre.
La classe de base est tree.hh qui est une distribution GNU qui se trouve sur internet.
Ma classe PQRTree (derivée de tree) a un attribut _index. Chaque noeud a un index (tattoo) différent afin de faire une liste d'adjacence Par exemple :
(0,1), (0,2) (1,3) (1,4) (1,5) (2,6) voudrais dire que 0 est le noeud racine duquel dependent le noeud 1, 2 et 3. Le noeud 1 a 3, 4, 5 comme fils. 2 a 6 comme fils.
Mon problème c'est que quand je essay de compiler mon code :
... et c'est la fonction resetPQT() qui me rend fou parce que je ne sais pas comment utiliser ici les iterateurs lors de l'héritage...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
72
73
74
75
76 #include "tree.h" template<typename T>struct Vertex { public: Vertex(); Vertex(T * iT) : _data(iT){}; ~Vertex(){/*delete _data;*/}; T * getData() const {return (_data);}; void setIndex(int iIndex){_index=iIndex;}; int getIndex(){return _index;}; private: T * _data; int _index; }; typedef Vertex<PQR>* node_t; template<typename tree_node_allocator = std::allocator<tree_node_<node_t> > > class PQRTree : public tree <Vertex<PQR>* , tree_node_allocator> { public : PQRTree() : _nbInd(0){}; virtual ~PQRTree(){}; template <typename iter> iter add_child(iter position, Vertex<PQR>* iVertex) { iter aIter; std::pair<int, int> aPair; aIter = append_child(position, iVertex); iVertex->setIndex(++_nbInd); //setting _PQT pairs aPair.first = (*position)->getIndex(); aPair.second = (*aIter)->getIndex(); _PQT.push_back(aPair); return aIter; }; template <typename iter> void resetPQT() { _PQT.clear(); iter aIter; //tree<node_t>::breadth_first_iterator aIter; std::pair<int, int> aPair; for (aIter = this.begin_breadth_first(); aIter != this.end_breadth_first(); aIter++) { aPair.first = (*aIter)->getIndex(); //aPair.second = (*aIter)->getIndex(); aPair.second = 69; _PQT.push_back(aPair); } } std::vector<std::pair<int,int> > getPQT() { return _PQT; }; private : int _nbInd; std::vector<std::pair<int,int> > _PQT; };
resetPQT() a pour but refaire la liste d'adjacence lors d'une modif dans l'arbre tel que l'effaçage d'un noeud ou un sous-arbre...
J'arrive pas...
C'est un problème de templates et d'heritage?
Le code de tree.hh je voulais le mettre mais il est trop long pour le forum
vous pouvez le trouver inmediatement sur http://www.aei.mpg.de/~peekas/tree/
Est-ce quelqu'un peut m'aider avec ce ça ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 //.... quelques déclarations... PQRTree<> aPQRTree3 PQRTree<>::iterator root3, aIter, aIterTest; //setting the root aPQR = new PQR_TST("Jeronimo",0); Vertex<PQR>* aVertex = new Vertex<PQR>(aPQR); root3 = aPQRTree3.begin(); aIter = aPQRTree3.insert(root3, aVertex); //iter ?? std::cout<<"index root->"<<aPQRTree3.index(aIter)<<std::endl; //setting level 1 aPQR = new PQR_TST("Perico",1); aVertex = new Vertex<PQR>(aPQR); //aPQRTree3.append_child(aIter, aVertex); aIterTest=aPQRTree3.add_child(aIter, aVertex); std::cout<<"index Perico->"<<aPQRTree3.index(aIterTest)<<std::endl; aPQR = new PQR_TST("Sylvain",2); aVertex = new Vertex<PQR>(aPQR); //aIter = aPQRTree3.append_child(aIter, aVertex); aIter = aPQRTree3.add_child(aIter, aVertex); std::cout<<"index Sylvain->"<<aPQRTree3.index(aIter)<<std::endl; //setting level 2 aPQR = new PQR_TST("Vanessa",3); aVertex = new Vertex<PQR>(aPQR); //aPQRTree3.append_child(aIter, aVertex); aIterTest = aPQRTree3.add_child(aIter, aVertex); std::cout<<"index Vanessa->"<<aPQRTree3.index(aIterTest)<<std::endl; aPQR = new PQR_TST("Vicente",4); aVertex = new Vertex<PQR>(aPQR); //aPQRTree3.append_child(aIter, aVertex); aIterTest = aPQRTree3.add_child(aIter, aVertex); std::cout<<"index Vanessa->"<<aPQRTree3.index(aIterTest)<<std::endl; //displaying the tree content PQRTree<>::breadth_first_iterator scanner4; for (scanner4 = aPQRTree3.begin_breadth_first(); scanner4 != aPQRTree3.end_breadth_first(); scanner4++) { (*scanner4)->getData()->display(); std::cout<<"index: "<<(*scanner4)->getIndex()<<std::endl; } std::cout<<std::endl; std::vector<std::pair<int,int> > aPQT = aPQRTree3.getPQT(); std::vector<std::pair<int,int> >::iterator aPQTIter; for(aPQTIter = aPQT.begin(); aPQTIter != aPQT.end(); aPQTIter++) std::cout<<"("<<(*aPQTIter).first<<","<<(*aPQTIter).second<<") "; std::cout<<std::endl; aPQRTree3.resetPQT();
Je vous remercie énormement !!
Partager