2014-12-02 22 views
6

quindi sto creando una classe che implementa un elenco di adiacenze. Attualmente nella mia definizione di una classe ho inizializzato due vettori:Inserimento di elementi nel vettore 2D

vector<vector<int>> adjList; 
vector<int> neighbors; 

e ho dichiarato due funzioni che ho intenzione di usare per farlo:

bool constructAdjList(); 
bool insertIntoAdjList(int, int); 

Sta diventando difficile confezionamento mia testa intorno vettori 2D. Capisco che sia essenzialmente un vettore di vettori, ma sono confuso su come inserire un nuovo valore in uno dei "subvettori". Ad esempio, sono in grado di creare un lista di adiacenza in createAdjList che è vuota con il seguente ciclo:

for (int i = 0; i < numOfValues; i++){ 
    neighbors.push_back(0); 
    adjList.push_back(neighbors); 
    neighbors.clear(); 
} 

Ma come posso dire, push_back il valore 5 alla 4 ° vettore in adjList, che sarebbe rappresentata in la mia funzione insertIntoAdjList come

insertIntoAdjList(4, 5); 

so di poter accedere ad un valore specifico in un vettore 2D dicendo adjList [4] [1], ma come posso spingere uno su di esso?

Grazie!

+0

Non capisco, non puoi farlo: 'adjList [4] [1] = 987'? – Kam

+0

Funziona se ho già un valore nella posizione [4] [1], ma se voglio effettivamente spingere un valore alla fine del vettore 4, devo in qualche modo push_back giusto? –

+0

Penso che un 'std :: unordered_map >' possa servire meglio. solo la mia opinione. – WhozCraig

risposta

10

a spingere il vettore che è un elemento di un altro vettore, è sufficiente fare questo

adjList[x].push_back(); 
+0

Oh wow, non sapevo che tu potessi specificare solo una delle coordinate nel vettore 2D. Questo lo rende molto più facile, grazie! –

+4

@Mardo Penso che sia importante capire che 'adjList [x]' restituisce un riferimento al vettore che è memorizzato in posizione 'x'.Quindi, 'adjList [x] [y]' è lo stesso di '(adjList [x]) [y]' e significa: Primo, dammi un riferimento al vettore alla posizione 'x' in' adjList' (chiamiamo V), quindi dammi un riferimento all'intero in posizione 'y' in V. – Lemming

1

Un paio di note qui.

tuo loop può essere significativamente ridotto solo essere utilizzando i costruttori dei vostri due membri:

vector<int> neighbors(1, 0); // set to length 1, value is zero 
vector<vector<int>> adjList(numOfValues,neighbors); // "outer" vector is numOfValues long 
.             // each row is a *COPY* of neighbor 

Se non è possibile fare questo in fase di costruzione (forse numOfValues ​​non è ancora noto), poi c'è ancora un ciclo migliore fraseggio possiamo usare:

// neighbors object can be reused 
neighbors.clear(0); 
neighbors.push_back(0); 
adjList.reserve(numOfValues); // reserving memory ahead of time will prevent allocations 
for (int i = 0; i < numOfValues; i++){ 
    adjList.push_back(neighbors); // push_back is by *COPY* 
} 

Nel tuo esempio, utilizzando chiaro e push_back per costruire essenzialmente lo stesso vettore di ogni iterazione del ciclo, si è rischiando una ripartizione e deallocazione ogni essa zione. In pratica, la maggior parte delle implementazioni non lo farà, ma se potessimo entrambi abbreviare e rendere potenzialmente le cose più efficienti, potremmo fare altrettanto.

Infine, se il numero di vicini è relativamente piccolo e simile da riga a riga (ad esempio un codice di elementi finiti con elementi tetraedrici, dove ogni elemento si connette a ~ 5 altri), allora come altri hanno suggerito che potrebbe essere meglio con una struttura diversa da quella del vettore vettoriale. Ad esempio, un singolo vettore che è organizzato logicamente in modo tale che una nuova "riga" inizi ogni N elementi.

Problemi correlati