giovedì 22 dicembre 2011

Creare una matrice dinamica velocemente [c++]


Diciamoci la verità, le matrici dinamiche sono utilissime, e su questo non c'è dubbio,  ma implementarle nel c++ non viene così naturale come per i vettori.
E' per questo motivo che in questo articolo, tratteremo un modo semplice e veloce per creare e riempire una matrice totalmente dinamica senza mai toccare un puntatore direttamente.

Ovviamente per far si che il nostro codice sia più semplice possibile ci avvaleremo di una libreria standard che è il Vector.
Questa libreria, come annuncia anche il nome, ci permette di creare un vettore facilmente e senza toccare nessun puntatore, a questo penserà tutto lui.
Ora, ragionando, cos'è una matrice? La matrice ovviamente può essere intesa come un vettore che all'interno di una sua cella ha un altro vettore, quindi aiutandoci con la struttura citata sopra, potremmo usare un Vector di Vector per avere così la nostra matrice (ovviamente dinamica) e senza aver toccato nessun puntatore direttamente.

Passiamo ora alla pratica, di seguito è riportato il codice di questa struttura opportunamente commentato per non destare altri dubbi.


Codice:
#include <iostream>
#include <vector>
using namespace std;


int main()
{
    int r, c;                                                               
    
    cout<<"inserisci righe e colonne"<<endl;
    cin>>r>>c;                                                             

    vector<int> riga(c);                                            
    vector<vector<int> > matrice;

    for(int i=0; i< r; i++)
    {
        for(int j=0; j< c; j++)
            cin>> riga[j];

        matrice.push_back(riga);
    }





   //funzione di stampa
    for(int i=0; i< r; i++)
    {
        for(int j=0; j< c; j++)
            cout<<matrice[i][j];

        cout<<endl;
    }

    return 0;
}



Spiegazione:

    vector<int> riga(c);                                            
    vector<vector<int> > matrice;




In questo pezzo noi stiamo dichiarando un vettore chiamato riga e abbiamo allocato c posizioni vuote dove c è il numero di colonne  lette da input.
Il secondo invece è proprio la nostra matrice che quindi sarà un vector di vector di interi (in questo esempio) e che quindi dovrà contenere un numero n di righe.




    for(int i=0; i< r; i++)
    {
        for(int j=0; j< c; j++)
            cin>> riga[j];

        matrice.push_back(riga);
    }



Questo pezzo invece è la vera e proprio lettura della matrice che viene eseguita con 2 indici, ovviamente, e nel ciclo più interno, noi leggiamo una a una le posizioni della nostra riga che abbiamo dichiarato prima.
Quando questo ciclo sarà terminato avremo quindi una riga letta e quindi pronta per diventare la prima (oppure la ennesima) riga della nostra matrice.
Per inserire quindi la nostra riga nella matrice basta usare la funzione di questa libreria che si chiama .push_back( <tipo di dato scritto nella dichiarazione>) ,questa funzione viene invocata sull'oggetto in cui dobiamo inserire un elemento, nel nostro caso la invochiamo sulla nostra matrice che a come abbiamo dichiarato prima è un vettore che accetta vettori e quindi questo inserimento andrà a buon fine inserendo tra le parentesi il nome dell'oggetto da aggiungere, nel nostro caso riga.


Ecco fatto dopo aver creato la nostra matrice questa potrà essere usata come una normale matrice statica con l'accesso per doppie parentesi quadre [n][m] , quindi l'utilizzo verrà più che immediato.


Nessun commento:

Posta un commento