2014-09-20 10 views
6

Contesto:C'è un modo più naturale per rappresentare una matrice di T di un vettore < vector< T>>?

Sto cercando di imparare C++ (leggendo alcuni dei libri consigliati dalla comunità di stackoverflow) e ho deciso di provare e creare un programma di automi cellulare con funzionalità di base solo per motivi di apprendimento (e perché è interessante per me).

Domanda:

C'è un modo più naturale per rappresentare una matrice di elementi cellulari che usare un vettore < vettore < cellulare >>? Sto cercando potenziali alternative nelle librerie standard o in alcune altre librerie popolari. Il commento riguardante la performance sarebbe apprezzato.

Non ho avuto problemi a utilizzare il vettore di vettori, né problemi con la sintassi, vorrei solo sapere le alternative. E dato che sono inesperto, ogni volta che scrivo del codice immagino che probabilmente ci sono molti modi più semplici per farlo che non troverei da solo.

Questa è la mia prima domanda, quindi se ho fatto qualcosa contro le linee guida per le domande, apprezzerei molto il fatto che tu l'abbia indicato.

Utile domanda relativa per riferimento futuro: Is a vector<vector<double>> a good way to make a make a matrix class?

+1

Se le prestazioni sono un problema reale, è probabile che si ottenga una persormanza leggermente migliore da un array multidimensionale grezzo: 'Cell (* cells) [100] = new Cell [100] [100];'.Il motivo è che il compilatore può accedere alle celle usando un semplice calcolo piuttosto che il doppio dereferenziamento. – Galik

+2

Dato che hai chiesto: Non includere "grazie in anticipo" o qualsiasi forma di "grazie" nella tua domanda. Questo non è un forum. Per quanto riguarda la tua domanda: considera una classe Matrix che fornisce 'operator() (size_t, size_t)' - può gestire la sua memoria come preferisce, in particolare evitando la doppia-indiretta del 'vector' annidato. C'è anche ['std :: valarray'] (https://stackoverflow.com/questions/1602451/c-valarray-vs-vector), ma è specializzato. –

+1

La "domanda correlata utile" sta confrontando un 'vettore di vettori' con una' matrice di matrici'. È probabile che entrambi questi approcci siano meno efficienti di un vero array multidimensionale per i motivi che ho già delineato. Un array multidimensionale richiede solo un dereferenziamento seguito da un semplice calcolo. Le matrici di array (o vettori) richiedono due dereferenze. – Galik

risposta

4

Ci sono generalmente due modi per rappresentare una matrice bidimensionale.

  1. Un array di puntatori ad altri array, che è il modello std::vector<std::vector<T>> usi.

  2. Un array ben confezionato contenente una riga dopo l'altra in memoria. Quindi l'elemento i, j può essere trovato a i + j * width.

Built-in array multidimensionali in C++ sono un po 'strano, in quanto condividono una sintassi simile a 1, ma il tipo
T[10][10] con i compilatori che conosco di attrezzi uno schema simile 2. Non lo so dalla parte superiore della mia testa se questo è richiesto dallo standard.

+1

Gli array multidimensionali devono essere implementati come 2. Sono array di matrici e gli array devono essere contigui. –

+3

Anche gli array multidimensionali possono essere gestiti utilizzando puntatori intelligenti: 'std :: unique_ptr celle (nuova cella [100] [100]);' – Galik

+4

Mi piace # 2 con una classe wrapper per un facile utilizzo. –

3

Sarei tentato di fare qualcosa del genere. Non so quanto vantaggio di velocità potrebbe avere su un vettore di vettori, quindi farei dei test per verificarlo. Presumo che avrà comunque qualche vantaggio di velocità.

typedef int Cell; 

int main() 
{ 
    // manage the raw multidimensional array pointer in a smart pointer 
    // so no need to worry about memory leaks 
    std::unique_ptr<Cell[][100]> cell_uptr(new Cell[100][100]); 

    // work from the raw pointer (maybe save a dereference?) 
    Cell(*cells)[100] = cell_uptr.get(); 

    for(size_t x = 0; x < 100; ++x) 
    { 
     for(size_t y = 0; y < 100; ++y) 
     { 
      // the compiler should be able to access cells[x][y] 
      // based on a simple calculation rather than a second dereference 
      cells[x][y] = 0; 
     } 
    } 
    // no need to worry about cleaning up 
} 

NOTA: Lo svantaggio di questo approccio è che il dimensioni dell'array è fisso in fase di compilazione.

+1

Sono sempre disposto ad imparare, può il down-voter (o chiunque altro) spiegare il/i problema/i? – Galik

+3

Non ho fatto un downvoting, ma uno dei principali inconvenienti di questo approccio è che il numero di colonne è fisso in fase di compilazione. –

+0

@Ben Ah si, grazie, lo menzionerò nella risposta. – Galik

Problemi correlati