mercoledì 31 dicembre 2014

Modern C++ - Gli Array

Ben ritornati sulle pagine del corso su Modern C++. A questo link trovate come sempre l'indice di tutte le precedenti lezioni.

Dopo aver giocato, seppur in modo rapido, con le variabili di tipo numerico, oggi vi delizio con un altro argomento: gli array numerici.

In C++, a differenza di altri linguaggi di programmazione, quali PHP, Python o Javascript, un array è una collezione di dati dello stesso tipo. Una sequenza puó esser, ad esempio, solamente di tipo int oppure double oppure di un altro tipo ben definito.

Un array può esser monodimensionale (noto anche come vettore) oppure multidimensionale (es., una matrice) e puó avere dimensione fissa, ovvero un numero predefinito di elementi, oppure a dimensione dinamica.

In Modern C++ si preferisce utilizzare strutture giá definite nella Standard Library, in modo da evitare errori di ogni genere e al fine di ottenere ottime prestazioni. infatti, è caldamente consigliato l'uso di std::vector, poiché permette di definire una sequenza di dati a dimensione dinamica, ma è anche possibile inizializzare tale struttura con una dimensione predefinita.
Tale struttura puó esser utilizzata includendo l'header apposito, mediante la direttiva #include <vector> e si puó utilizzare nel seguente modo:
#include 

std::vector<int> array;                  //array di tipo int, vuoto
std::vector<double> array_double;        //array di tipo double, vuoto
std::vector<double> array_double_2(10);  //array di 10 elementi di tipo double, inizializzati con 0.0
std::vector<double> array_double_2(10, 2.5);  //array di 10 elementi di tipo double, inizializzati con 2.5
Vector è una struttura altamente efficiente, che permette l'espansione o dimensione dello stesso array, senza badare ad allocare/deallocare manualmente la memoria.

E`possibile creare quindi un array vuoto oppure un array contenente valori predefiniti. Ma come possiamo giocare con essi?

Ecco di seguito un esempio di listato C++:
Come potete notare,ho incluso l'header <vector> e ho dischiarato alcuni array monodimensionali: un array di integer e 4 array di tipo double, ciascuno creato in modo differente.
Al fine di accedere singolarmente agli elementi di un array, occorre scorrere all'interno di essi. In C++ è possibile farlo in 2 modi: nel nuovo modo, utilizzando i cicli range-based, oppure nel modo classico, C-style, utilizzando il ciclo index-based. Nel primo caso, non si utilizza una variabile indice per accedere all'elemento, bensí si estrare una copia dell'elemento stesso (vedremo come sará possibile utilizzarne il riferimento, nei prossimi post) e si puó lavorare sulla copia. Nel secondo caso, si utilizza un indice che permette di accedere agli elementi singolarmente; la variabile indice vá incrementata di volta in volta per scorrere il vettore in sequenza, controllandone il valore, che deve esser minore della dimensione del vettore. Infatti, in C++, un vettore ha elementi con indici che vanno da 0 a N-1, dove N è il numero di elementi.
Nel caso di array_double_2, avente 10 elementi, gli indici vanno da 0 a 9.

Indice per scorrere un vettore di 10 elementi


Le due diverse applicazioni le notate alle righe 12 e 42.

Vector mette a disposizione alcune interessanti funzioni: push_back(), che permette di inserire in coda un nuovo elemento nel vettore; pop_back(), che permette di rimuove l'ultimo elemento del vettore; size(), che riporta la dimensione del vettore (da non confondere con il giá visto sizeof, il quale riporta la dimensione del vettore in byte.

E' possibile inoltre copiare i valori di un vettore in un secondo vettore: per vettori di piccole dimensioni, questa operazione risulta efficiente, mentre per dimensioni maggiori, puó esser estremamente svantaggiosa. Vedremo nei prossimi post come è possibile risolvere questo problema.

L'output del codice parla da solo:
Output di DemoApp2
E gli array multidimensionali? Possono esser creati nel seguente modo:


std::vector<std::vector<int>> array;  //array di array di tipo int, vuoto


Alla prossima e buon 2015 :)

2 commenti:

  1. Mi dici solo una cosa: le variabili di tipo auto.

    RispondiElimina
    Risposte
    1. auto è un tipo di dato derivato dal compilatore in base al contesto. Non puó esser creata una variabile di tipo auto senza un contesto. Esempio:

      auto nome_variabile; //errore, nessun contesto
      auto nome_variabile = 0; //ok, nome_variabile é di tipo int.
      auto nome_variabile = 'A'; //ok, nome_variabile è un carattere
      std::vector vettore; //errore, nessun contesto

      Elimina