Problème avec templates et iterateurs :(
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 :
Code:
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;
}; |
... 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...
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... :bug:
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/
Code:
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(); |
Est-ce quelqu'un peut m'aider avec ce ça ?
Je vous remercie énormement !!