2016-02-19 16 views
27

Sono nuovo in C++ STL e non riesco a comprendere la rappresentazione grafica.array di vettori o vettore di array?

vector<int> adj[N]; 

Quindi questo crea un array di tipo vector o crea un vettore di array? Il codice BFS sembra attraversare un elenco di valori presenti ad ogni istanza di adj [i], e quindi sembra funzionare come un array di vettori. sintassi per creare un vettore è:

vector<int> F; 

atto a creare efficacemente un singolo vettore dimensionale F.

Qual è la differenza tra

vector< vector<int> > N; 

e

vector<int> F[N] 
+2

provare a leggere da destra *** a sinistra***. In questo caso diventa una matrice di vettori. –

+1

'int x [N];' è una matrice di 'int'; 'vector y [N];' è una matrice di 'vector '. –

+1

Ricordate, per ogni array definito come 'T nome [N]', avete una matrice, 'nome', con elementi' N' di tipo 'T'. Inoltre, mentre siamo in tema di matrici, 'std :: array ' è un contenitore per una matrice sotto forma di 'T nome [N]', proprio come 'std :: vector ' è un contenitore per una matrice di lunghezza variabile di tipo 'T'. –

risposta

32

Così fa questo (vector<int> adj[N];) crea una matrice di tipo vettoriale o questo crea un vettore di array?

Crea serie di vettori

Qual è la differenza tra

vector< vector<int> > N; 

e

vector<int> F[N] 

Nel primo caso si sta creando una matrice dinamica di array dinamici (vettore di vettori). La dimensione di ogni vettore potrebbe essere modificata durante l'esecuzione e tutti gli oggetti verranno allocati nell'heap.

Nel secondo caso si sta creando un array di vettori di dimensioni fisse. È necessario definire N in fase di compilazione e tutti i vettori verranno posizionati nello stack , tuttavia, ciascun vettore allocherà elementi nell'heap.

Preferisco sempre il vettore del caso vettori (o della matrice, se è possibile utilizzare librerie di terze parti) o std::array di std::array s in caso di dimensioni in fase di compilazione.

Sono nuovo a C++ STL e non riesco a comprendere la rappresentazione del grafico .

Si può anche rappresentare grafico come un std::unordered_map<vertex_type,std::unordered_set<vertex_type>>, dove vertex_type è il tipo di vertice (int nel tuo caso). Questo approccio potrebbe essere utilizzato per ridurre l'utilizzo della memoria quando il numero di spigoli non è enorme.


: Per essere precisi - non sempre sulla pila - può essere una parte di un oggetto complesso sul mucchio. Inoltre, lo standard C++ non definisce alcun requisito per lo stack o l'heap, fornisce solo i requisiti per la durata dello storage, come automatico, statico, thread o dinamico.

+3

Non voler essere schizzinosi ma 'vector F [N]' non alloca necessariamente F nello stack. Dipende dal contesto. –

+1

@MohamadElghawi, intendi depositi automatici/dinamici? – soon

+1

Ad esempio: può avere una durata di archiviazione statica o anche essere inserito nell'heap se si trova all'interno di un oggetto che viene acquisito. –

6
vector<int> arr[N]; 

Visualizza una matrice di vettori, ogni matrice [i] avrebbe un vettore memorizzato in essa che può attraversare molti valori. È come una Matrice di una Lista Collegata in cui le teste sono solo memorizzate in posizioni di matrice [i].


vector<vector<int> > N vs vector<int> F[N] 

La differenza tra vettore 2D e una matrice di vettore è che 2D vettori possono estendersi in formato mentre matrice di vettori hanno la loro dimensione fissa per la dimensione dell'array.

+0

E anche un vettore è un contenitore di librerie C++ standard (come anche un 'std :: array') che consente l'uso di iteratori, algoritmi e così via, mentre un array semplice è solo una struttura di dati di basso livello senza wrapping né Gli extra. Prima per la programmazione di alto livello e la seconda per quella di basso livello - l'implementazione per 'std :: array' o' std :: vector' usa gli array ... –

+1

@SergeBallesta È possibile utilizzare iteratori e algoritmi con matrici raw, ad es. usando le funzioni globali 'begin' e' end'. – emlai

5

Sotto il cofano un vettore utilizza ancora array, è la realizzazione specifica, ma è sicuro di pensare che:

vector<int> 

crea internamente un int []. Ciò che i vettori ti danno è che è astratto da te la parte in cui se vuoi ridimensionare non devi riassegnare manualmente ecc., Lo fa per te (più molto di più ovviamente). Quando si esegue: vector<vector<int>> si crea un vettore di vettori, ovvero una matrice 2D. Puoi nidificarlo quanto vuoi. Vector accetta un tipo T e assegna un array di quel tipo. quindi se passi il vettore come tipo T, farà effettivamente quello che hai fatto nella tua prima riga, una serie di vector<int>. Speranza ha senso

4

Risposta breve:
Si tratta di una serie di vector <int> s.

lungo Risposta:
Durante la lettura di una dichiarazione come

vector<int> adj[N]; 

Il compilatore utilizza un metodo noto come "di spirale" o "in senso orario-regola" in ordine interpretare cosa significa L'idea alla base della regola della spirale è che si inizia dal nome della variabile, e si muove verso l'esterno in una spirale in senso orario per capire che tipo di variabile è. Ad esempio:

char* str [10]; 

possono essere interpretate come questo:

 ____ 
     | | 
char* str [10]; 
    |_________| 


Fare str un array di 10 char* s.

Pertanto, vector<int> adj[N]; è un array di vettori piuttosto che un vettore di array



pratica rende perfetti:

1: Cosa int * foo [ ]; significa?

Risposta:

"pippo" è un array di puntatori a interi


2: Che cosa vuol dire int * (*foo [ ])();?

Risposta:

"foo" è un array di puntatori a funzioni che ritornano puntatori a interi


3: Che cosa vuol dire int * (*(*foo [ ])())();?

Risposta:

"foo" è un array di puntatori a funzioni che ritornano puntatori a funzioni che ritornano puntatori a interi

+0

Ci scusiamo per non aver pubblicato direttamente la foto. Sfortunatamente, non ho ancora la reputazione richiesta. –

+0

^Non importa, ho aggiunto l'immagine. –