2016-03-21 27 views
1

ich diesen Code haben:C++ Vektor, was bedeutet dieser Code?

const int maxnodes = 5000; 
struct Edge 
{ 
    int to, rev; 
    int f, cap; 
}; 

vector<Edge> g[maxnodes]; 

Dies ist durchaus verständlich, aber ich sah in späteren Linien als

verwendet
Edge &e = g[u][j]; 

hier sind 'u,j' ganze Zahlen. Was ist "g[u][j]"? 'g' ist Vektor gefüllt mit 'Edge' Struct, wie kann es wie ein Array von Arrays handeln?

Ich weiß Edge &e ist eine Referenz, und es wird eine ‚Edge‘ Aufnahme-Struktur, aber ich bin auf 'g[u][j]' verwirrt.

Der Quellcode ist here

Vielen Dank im Voraus! :)

+5

'Vektor g [maxNodes];' ist eine C-Reihe von Vektoren. – milleniumbug

+0

Für 1) bedeutet dies, dass Knoten mit dem Wert von maxnodes (die eine Konstante sein muss) initialisiert werden, und dass andere zwei (src und dest) sind Ganzzahl ohne Anfangswert ... –

+0

Stellen Sie nicht zwei Fragen in einem zusammen Frage. In diesem Fall habe ich das erste herausgeschnitten, weil es nichts mit dem Titel zu tun hat und Sie sollten Ihr C++ - Lehrbuch lesen. Es war wirklich eine Anfängerfrage. – MSalters

Antwort

0

1) int nodes = maxnodes, src, dest;

Hier ist ein nodesint mit dem Wert initialisiert gleiche wie die der . src und dest sind auch int, aber ohne Anfangswert.

2) vector<Edge> g[maxnodes];

g ist hier eine Anordnung von std::vector.

Edge &e = g[u][j];

Frage: Was ist g[u][j]?

A. Es ist die Edge in g in der u th Zeile und j th Spalte gespeichert.

Q. g ist vector gefüllt mit Edge struct, wie kann es sich wie ein Array von Arrays handeln?

A. Weil std::vectoroperator[] für sich in seiner Definition überladen hat. Siehe: http://en.cppreference.com/w/cpp/container/vector/operator_at

2

int nodes = maxnodes, src, dest;

Das bedeutet, alle ganzzahlige und Knoten mit maxNodes

vector<Edge> g[maxnodes] ist die Matrix von Vektor-initialisiert wird.

Vektor ist wie ein dynamisches Array. g [x] zeigt auf einen Vektor. g [x] [y] zeigt auf eine Kante.

0

Es ist eine C-Reihe von Vektoren

Beispiel mit maxnodes = 5. G[5]

0 -> std::vector<Edge> 
1 -> std::vector<Edge> 
2 -> std::vector<Edge> 
3 -> std::vector<Edge> 
4 -> std::vector<Edge> 

Wenn jedes Element von g 5 Elemente enthält, würde es so aussehen

G 
- 
0 -> {0, 1, 2, 3, 4} 
1 -> {0, 1, 2, 3, 4} 
2 -> {0, 1, 2, 3, 4} 
3 -> {0, 1, 2, 3, 4} 
4 -> {0, 1, 2, 3, 4} 

Bedeutung, g[u][j], beispielsweise mit g[2][3] auf das dritte Element in dem Vektor an der zweiten entspräche Element von g.

g[2][3]

G 
- 
0 -> {0, 1, 2, 3, 4} 
1 -> {0, 1, 2, 3, 4} 
2 -> {0, 1, 2, ***3***, 4} 
3 -> {0, 1, 2, 3, 4} 
4 -> {0, 1, 2, 3, 4} 
1
int nodes = maxnodes, src, dest; 

Hier nodes, src, dest sind alle ganzen Zahlen, wo nodes mit anderen initialisiert wird, werden nicht initialisiert.

vector<Edge> g[maxnodes]; 

Wie erwähnt @milleniumbugg ein C-Array von Vektoren ist:

g[u][j] wird i te Element von u te Element von Array g geben. Als u ist das Element g ein Vektor, auf den Sie mit Hilfe des Operators [] auf seine Mitglieder zugreifen können.

0

Diese

int nodes = maxnodes, src, dest; 

ist eine Erklärung, die zu diesen drei Erklärungen

int nodes = maxnodes; 
int src; 
int dest; 

Diese

vector<Edge> g[maxnodes]; 

std::vector<Edge> ist eine Erklärung einer Anordnung von Objekten des Typs äquivalent ist. Sie können den Subscript-Operator mit Arrays verwenden.

So gibt Ausdruck g[u] das Element des Arrays mit Index u, die eine Referenz auf ein Objekt des Typs std::vector<Edge> ist.

Klasse std::vector Überlastungen auch den Index-Operator. So Ausdruck g[u][j] gibt das Objekt vom Typ Edge mit Index j in dem Vektor des Arrays mit dem Index u.

Dcelaration

Edge &e = g[u][j]; 

deklariert eine Referenz auf dieses Objekt vom Typ Edge.

0

ich andere glauben, haben bereits erklärt, was jede Zeile gut tut. Ich wies darauf hin, dass gerade in der zweiten Zeile,

Edge &e = g[u][j]; 

der Code die Edge bei g[u][j] in einem Referenz stellt vermutlich der folgende Code leichter zu beiden machen lesen und schreiben (statt g[u][j] mehrere Male des Wiederholens).