wie baut man eine Baumstruktur in C++ mit std::map
Ich bin versucht, zu schreiben eine Baum-Art von Struktur in C++. Wie in jedem Baum sind die Zweige und Blätter. Ein Zweig enthalten kann, die anderen Zweige sowie Blätter.
Nun meine Umsetzung fordert, für jeden Zweig und Blatt, um verschiedene Funktionen haben. So zum Beispiel.
Nehmen Sie die Baumstruktur
Root
| |
Branch1 Branch2 Branch3
| | |
Leaf1 Leaf2 Branch4
Nun, Jedes Blatt und Zweig hat eine andere Funktion ausführen, so Leaf1 wird eine Funktion aufgerufen, leaf1_func, Leaf2 haben leaf2_func, Branch4 hat Branch4_func.
War ich zunächst versucht zu implementieren composite-design-pattern. Das heißt aber auch, ich hätte so viele Klassen wie Blätter. Aber da habe ich Tonnen von Blättern und Zweigen, die ich möchte vermeiden, schafft mehr Klassen. Ich weiß, dies ist eine ungewöhnliche situation, aber hatte gehofft, jemand könnte mir helfen in dieser Hinsicht. Was wäre die beste Möglichkeit dies umzusetzen Baum, ohne zu viele Klassen.
ich bin mit map STL-container zum speichern von Daten als auch ich wollen, diesen Baum verwenden-Implementierung, um dieses Problem zu lösen, die in TSP-problem.
#include <cstdlib>
#include <iostream>
#include <map>
using namespace std;
int n=4;
int min=1, max=10;
struct graph
{
int nodes;//total no. of nodes or vertices namely cities
std::map<std::pair<int,int>, int> graphMap;//an object that links a pair of vertices
};
void directed_Graph(graph);
void directed_Graph(graph G)
{
//int n = G->nodes; //city count
int i, j;
for(i = 0; i <= n-1; i++)
{
for(j = 0; j <= n-1; j++)
{
if(i!=j)
{
G.graphMap[std::make_pair(i,j)] = (rand()%10)+1;
//cout<<G.graphMap[std::make_pair(i,j)]<<"\n";
}
else
{
G.graphMap[std::make_pair(i,j)] = 0;
}
}
}
}
int main(int argc, char** argv)
{
graph g;
g.nodes = 4;
directed_Graph(g);
return 0;
}
- Was ist mit dem zitierten text block? Ist dieses Hausaufgaben?
- keine seinen keine Hausaufgaben, ich möchte ein Vorschlag, wie Sie zu vermeiden, mit diesen Funktionen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verschiedene Funktionen mit der gleichen Signatur haben immer noch den gleichen Typ. Auch wenn die Funktionen sind völlig unabhängig, können Sie ein Baum, der speichert Zufallszahlen mithilfe
void *
(type erasure) und dann typecast zurück zu den bekannten tatsächlichen Typ nach dem Blattknoten erreicht ist.Können Sie auch virtuelle Methoden-Vererbung und speichern Zeiger auf Basisklasse-Typ in den Baum. Es hängt davon ab, was der Knoten wirklich sind.
Nichts davon ist wirklich im Zusammenhang mit der Tat geht es in einem Graphen.
int
es gibt also keine Funktion beteiligt. Edit: Oh, aber Sie sollten rufen Sie graphMap.size() anstatt eine variableint nodes;
.std::map< std::pair< int, int >, node >
. Beachten Sie, dass für eine Stadt mit id N, Sie können alle seine ausgehenden Kanten durch Durchlaufen vongraphMap.lower_bound( make_pair( N, 0 ) )
zugraphMap.lower_bound( make_pair( N+1, 0 ) )
. So das sollte helfen, dass die Grafik Aussehen wie ein Baum.Vom Aussehen Sie Diagramm es scheint, dass Sie möchten, dass ein Baum in dem die Knoten können mehr als zwei Kinder haben. Wenn das der Fall ist, dann werden die STL-Container sind nicht für Sie arbeiten wird. Sie sind self-balancing binary trees.
Wenn Sie OK sind, mit einem binären Baum, dann gibt es ein paar Möglichkeiten, dies zu tun. Die erste ist, um Funktionen schreiben und dann zu speichern-Funktion Zeiger oder funktoren, die in den Baum.
Das problem bei diesem Ansatz ist, dass alle Ihre Funktionen müssen denselben Typ haben, d.h. Sie nehmen den gleichen Argumenten und den gleichen Rückgabetyp. Was mehr ist, während Sie definieren können, verschiedene Verhaltensweisen, können Sie nicht halten-Zustand, d.h. Sie können nicht speichern von Daten in eine Funktion Zeiger.
Zweiten Optionen, wie Sie bereits erwähnt, ist Klassen schreiben. Wenn Sie brauchen, um zu variieren, das Verhalten der Knoten, dann ist der beste Weg, dies zu tun ist die Definition einer Schnittstelle und der Nutzung Polymorphismus.
Ihnen nicht sagen, ob Sie zu zwingen, bestimmte Verhaltensweisen zu sein, Blätter und andere interne Knoten, oder die Knoten müssen bestellt werden, in einer bestimmten Weise, aber wenn Sie das tun, dann haben Sie möglicherweise in der Lage, dies zu erreichen durch die Erstellung einer benutzerdefinierten weniger-als-Funktion:
Wieder, wenn Sie etwas brauchen, das nicht ein binärer Baum, wenn, dann hast du Pech. Und jeder Weg Sie Scheibe das müssen Sie code schreiben, der Implementierung das Verhalten gespeichert, in jedem Knoten, ob es Funktionen oder Klassen.
std::set
undstd::map
don ' T setzen Sie eine Eltern-Kind-Beziehung auf die Nutzer, also sind Sie nicht nützlich, wenn Sie möchten, dass eine tatsächliche Baum, Sie können manipulieren, in einen Baum-wie Mode.wenn Sie über begrenzte Tiefe des Baumes ist es bequemer, um es zu beschreiben, wie diese:
//....etc hier ist Tiefe == 3