J'ai résolu une question, l'algorithme de Dijkstra, en C++. Je l'ai implémenté en utilisant la liste d'adjacence. J'ai donc une classe pour node
, une classe pour minHeap
et une classe pour Graph
.Utiliser ou ne pas utiliser de nouveau pour la création d'une classe dans un autre
class node
{
int vertex,weight;
node *next;
friend class Graph;
friend class minHeap;
public:
node();
node(int,int);
};
node::node(){
vertex=weight=0;
next=0;
}
node::node(int v,int wt){
vertex=v;
weight=wt;
next=0;
}
Ai-je définir la classe minHeap
de cette façon (sans fonction d'ami) et créer un objet dans la fonction getDijkSP()
normalement, ce qui me permet d'utiliser l'objet que dans cette fonction?
class minHeap
{
node *heap;
int heapSize,capacity,*pos;
public:
minHeap(int);
void addElement(node);
node extractMin();
void minHeapify(int);
void decreaseKey(int,int);
};
minHeap::minHeap(int cap){
heap=new node[capacity=cap];
heapSize=-1;
pos=new int[cap]();
} //eliminating other methods
class Graph
{
node **adjList;
int v;
bool *visited;
public:
Graph(int);
void addEdge(int,int,int);
void removeEdge(int,int);
bool existsEdge(int,int);
void getDijkSP();
};
Graph::Graph(int vertices){
adjList=new node*[v=vertices];
for(int i=0;i<v;i++)
adjList[i]=NULL;
}
void Graph::getDijkSP(){
minHeap hp(v); //here
hp.addElement(node(0,0));
for(int i=1;i<v;i++)
hp.addElement(node(i,INT_MAX));
while(!hp.isempty()){
node temp=hp.extractMin();
cout<<temp.vertex<<" "<<temp.weight<<endl;
for(node *current=adjList[temp.vertex];current;current=current->next)
hp.decreaseKey(current->vertex,current->weight+temp.weight);
}
}
(OR) Est-ce que je définir la classe minHeap
avec une fonction ami, afin que je puisse créer un objet de la classe minHeap
en utilisant le nouveau mot clé? (Et cela me permet de définir l'objet minHeap
dans le cadre de la classe Graph
, pour que je puisse l'utiliser dans toutes ses fonctions pour d'autres capacités aussi bien.)
class minHeap
{
node *heap;
int heapSize,capacity,*pos;
friend class Graph; //say like this
public:
minHeap(int);
void addElement(node);
node extractMin();
void minHeapify(int);
void decreaseKey(int,int);
};
minHeap::minHeap(int cap){
heap=new node[capacity=cap]();
heapSize=-1;
pos=new int[cap]();
}
class Graph
{
node **adjList;
int v;
bool *visited;
minHeap *hp; //and do this
public:
Graph(int);
void addEdge(int,int,int);
void removeEdge(int,int);
bool existsEdge(int,int);
void getDijkSP();
};
Graph::Graph(int vertices){
adjList=new node*[v=vertices];
for(int i=0;i<v;i++)
adjList[i]=NULL;
hp=new minHeap(v); //dynamic allocation
}
void Graph::getDijkSP(){
hp->addElement(node(0,0));
for(int i=1;i<v;i++)
hp->addElement(node(i,INT_MAX));
while(!hp->isempty()){
node temp=hp->extractMin();
cout<<temp.vertex<<" "<<temp.weight<<endl;
for(node *current=adjList[temp.vertex];current;current=current->next)
hp->decreaseKey(current->vertex,current->weight+temp.weight);
}
}
J'ai lu this et quelques autres articles, mais veulent en particulier connaître les avantages, les inconvénients et la pertinence des deux méthodes pour des types de questions similaires.
J'ai fourni les constructeurs pour les classes pour une meilleure clarté.
Si vous allez utiliser 'new' pour allouer des objets, ce que vous ne devriez probablement pas faire, vous devez ajouter des destructeurs qui suppriment tous ces objets en conséquence. –
Oui. Désolé de ne pas l'avoir ajouté, mais disons qu'ils sont là. Je veux savoir comment lier une classe qui définit une structure de données avec une classe plus grande qui résout un problème, de sorte que l'on peut utiliser la structure de données dans le problème. Et si le problème nécessite plus d'une structure de données? ..Je veux juste connaître la meilleure méthode pour définir la structure de tels problèmes. – revanthc97