La classe std::vector della Standard Template Library del C++

Похожие документы
Esercizio 2: Algebra dei Puntatori e Puntatori a Puntatori

Il paradigma OO e le Classi

Grammatica di base: Pointers

Implementazione dell albero binario in linguaggio C++

Laboratorio di Informatica

Il linguaggio C. Puntatori e dintorni

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

L2 Elaborazione di immagini in C/C++

Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN

Ricerca sequenziale di un elemento in un vettore

C: panoramica. Violetta Lonati

La programmazione ad oggetti (OOP)

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Introduzione al linguaggio C Puntatori

Gestione di files Motivazioni

La struttura dati CODA

Ricerca binaria (o dicotomica) di un elemento in un vettore

Funzioni, Stack e Visibilità delle Variabili in C

Indice. La dichiarazione using. Il namespace std della Libreria Standard del C++ std::cin. Le Stringhe in C++ (CAP 3, parte I)

Esercizi C su array e matrici

Strutture dati e loro organizzazione. Gabriella Trucco

La scrittura di un programma Modellizzazione del programma Scrittura del codice Esercizi. Sperimentazioni I. Alberto Garfagnini, Marco Mazzocco

Quicksort e qsort() Alessio Orlandi. 28 marzo 2010

Laboratorio di Algoritmi e Strutture Dati

La scrittura di un programma Modellizzazione del programma Scrittura del codice Esercizi. Sperimentazioni I. Alberto Garfagnini, Marco Mazzocco

STRUTTURE DI CONTROLLO DEL C++

Dati aggregati. Violetta Lonati

I/O FILE. Sommario I/O FILE. I/O FILE LETTURA DA FILE DI TESTO oggetto di tipo ifstream. I/O FILE: lettura e scrittura su file di testo

Gestione dinamica della memoria

Guida introduttiva al PHP

Programmazione I - Laboratorio

Algoritmi di Ricerca. Esempi di programmi Java

ESERCIZI DI PROGRAMMAZIONE C/C++ per le classi seconde

Esercitazione 11. Liste semplici

Sommario. Introduzione... xv. Giorno 1 Elementi base del linguaggio C

Laboratorio di Programmazione e Calcolo

Array di array. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 03. A. Miola Febbraio 2008

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella

Corso di Programmazione ad Oggetti

Programmazione Procedurale in Linguaggio C++

Algoritmi di Ricerca. Esempi di programmi Java

Algoritmi, Strutture Dati e Programmi. UD 2.b: Programmazione in Pascal

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Esercizio. Vogliamo scrivere delle funzioni che ci permettano di estrarre delle informazioni statistiche da un vettore (array) di dati:

Le basi del linguaggio Java

14 - Metodi e Costruttori

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Indice. Introduzione PARTE PRIMA LE BASI DEL C++: IL LINGUAGGIO C 1

Laboratorio di programmazione

Gli Array. Dichiarazione di un array

Fondamenti di Informatica - 1. Prof. B.Buttarazzi A.A. 2011/2012

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Indice. Prefazione. 3 Oggetti e Java 53

Strutture Dinamiche. Fondamenti di Informatica

Транскрипт:

La classe std::vector della Standard Template Library del C++ Alberto Garfagnini Università degli studi di Padova 23 Ottobre 2013 Programmazione generica in C++ : i Template I templates sono probabilmente uno degli aspetti più importanti della programmazione in linguaggio C++. Permettono di definire delle azioni che si vuole vengano attuate da oggetti di tipo diverso. I template si dichiarano usando la parola chiave template seguita da una lista di parametri tipo template <parameter list>...template declaration... Esistono diversi tipi di dichiarazioni template di una funzione template; di una classe template; di membri (metodi) di una classe;...

Esempio di funzione template Si voglia scrivere una funzione che ritorna il massimo tra due oggetti generici // funzione che ritorna il piu grande tra due oggetti template <typename objt> objt & get_max( objt & value1, objt & value2 ) if (value1 > value ) return value1; else return value2; Consideriamo due esempi di invocazione della funzione con tipi int e double int n1 = 5, n2 = 7; int n_max = get_max <int> (n1, n2); double val1 = 5.3, val2 = -3.4; double val_max = get_max <double> (val1, val2); Programmazione generica in C++ : i Template La Standard Template Library contiene svariati ottimi esempi di template. Nella STL sono disponibili una vasta collezione di classi template e funzioni che contengono algoritmi e utility generiche. Un esempio tipico sono i contenitori template che implementano array dinamici, liste, code, stack, etc. sono disponibili: contenitori per lo storage dell informazione; iteratori che permettoni di accedere all informazione; algoritmi per manipolare il contenuto dei contenitori

Contenitori sequenziali: std::vector la classe std::vector permette di creare un array dinamico e di accedere o manipolare un suo elemento data la posizione (indice) usando l operatore [] 1. è un array dinamico 2. è possibile aggiungere o togliere elementi, modificando run-time la dimensione 3. normalmente si aggiungono elementi nuovi alla fine, ma è anche possibile inserirli all inizio o in una posizione qualsiasi 4. è possibile effettuare delle ricerche all interno del vector Gli iteratori nella STL l esempio più semplice di iteratore è un puntatore Gli iteratori sono classi template che possono essere pensati come una generalizzazione dei puntatori tramite gli iteratori è possibile navigare tra gli elementi di un contenitore in modo da accedere agli elementi ed eseguire operazioni gli iteratori STL posssono essere classificati in Iteratore di Input : possono essere usati per accedere ad un oggetto che si trova in una collezione. Iteratori di Output : permettono al programatore di scrivere nella collezione. inoltre, a seconda di come permettono di muoversi nella collezione sono Iteratori in Avanti Iteratori Bidirezionali Iteratori ad Accesso Casuale

std::vector La classe std::vector fornisce le funzionalità di un array dinamico con le seguenti caratteristiche: inserzione di nuovi elementi alla fine dell array rimozione di elementi dalla fine dell array inserzione/rimozione di elementi in testa o in un punto qualsiasi dell array per usare il contenitore bisogna includere l header file Es 1 - creazione di vettori // Un vettore dinamico std::vector <double> v_dyna; // Un vettore con 10 elementi std::vector <int> vint_10_elements(10); // Un vettore con 10 elementi, inizializzati a 90 std::vector <int> vint_10(10, 90); // Un vettore inizializzato con il contenuto di un altro std::vector<int> vcopy(vint_10_elements); // Un vettore con 5 valori presi da un altro std::vector<int> vcopy_5(vint_10.begin(),vint_10.begin()+5);

Es 2 - Aggiungiamo elementi ad un vettore // Un vettore dinamico std::vector <int> v_dyna; // Inseriamo dei valori v_dyna.push_back(1); v_dyna.push_back(22); v_dyna.push_back(22+34); v_dyna.push_back( rand() ); std::cout << "Il vettore contiene "; std::cout << v_dyna.size() << " elementi\n"; Es 3 - Utilizzo semantica degli array // Fissiamo la dimensione dell array std::vector <double> v(4); // Inseriamo dei valori v[0] = 1.0; v[1] = 22.0; v[2] = sqrt(3.1415/2); v[3] = 37.5; std::cout << "Il vettore contiene "; std::cout << v.size() << " elementi\n";

Es 4 - Uso degli iteratori using namespace std; vector <double> v(4);... vector <double>::iterator walk = v.begin(); while (walk!= v.end()) cout << * walk << endl; // L iteratore va incrementato // per accedere all elemento successivo walk++; Es 4bis - Uso della sintassi degli array using namespace std; vector <double> v(4);... int index = 0; while (index < v.size()) cout << v[index] << endl; // Il contatore va incrementato // per accedere all elemento successivo index++;

Es 5 - Ricerca del numero 2991 nel vettore #include <algorithm> using namespace std; vector <int> vi;... vector <int>::iterator element; element = find(vi.begin(), vi.end(), 2991) // Controlliamo se l elemento e stato trovato if (element!= vi.end()) int index = distance(vi.begin(), element); cout << "Valore " << *element; cout << " trovato alla posizione " << index << endl; Es 6 - Rimozione di un elemento alla fine del vettore // Un vettore dinamico std::vector <int> v_dyna; // Inseriamo dei valori v_dyna.push_back(23); v_dyna.push_back(76); std::cout << "Il vettore contiene "; std::cout << v_dyna.size() << " elementi\n"; // Estraiamo un valore v_dyna.pop_back(); std::cout << "Il vettore contiene "; std::cout << v_dyna.size() << " elementi\n";

Es 7 - Vettore a 2-dim una matrice n m può essere pensata come un vettore di vettori // matrice bidimensionale 3 x 2 using namespace std; vector <vector <double> > A(3, vector <double> (2,0); A[0][0] = 0; A[0][1] = 1; A[1][0] = 10; A[1][1] = 11; A[2][0] = 20; A[2][1] = 21; // Loop con indici for (int i=0; i<3; i++) for (int j=0; j<2; i++) std::cout << A[i][j] << endl; Es 7 - Vettore a 2-dim con iteratori // matrice bidimensionale 3 x 2 using namespace std; vector <vector <double> > Matrix; vector <double> > A, B; vector <vector <double> >::iterator iti; vector <double>::iterator itj; A.push_back(100);... B.push_back(20);... Matrix.push_back(A); Matrix.push_back(B); // Loop con iteratori for (iti=matrix.begin(); iti!=matrix.end(); iti++) for (itj=(*iti).begin(); itj!=(*iti.end()); itj++) std::cout << *itj << endl;

std::vector - costruttori vector <type> v crea un vettore di tipo type vector <type> v(n) crea un vettore di tipo type e dimensione n vector <type> v(n, const T & t) crea un vettore di tipo type con dimensione n e lo inizializza ai valori costanti t vector <type> v(begin_iterator,end_iterator) crea un vettore di tipo type e lo inizializza copiando gli elementi da un altro vettore da begin_iterator a end_iterator std::vector - metodi v.begin() (iteratore) : ritorna un iteratore che punta al primo elemento del vettore v.end() (iteratore) : ritorna un iteratore che punta all elemento successivo all ultimo v.size() (int) : ritorna il numero di elementi del vettore (è uguale a v.end() - v.begin()) v.capacity() (int) : ritorna il numero di elementi inseribili senza necessità di riallocare la memoria a == b (bool) : ritorna true se a e b hanno la stessa dimensione e ogni elemento di a è equivalente (==) al corrispondente elemento di b

std::vector - metodi v.push_back(t) (void) : inserisce un elemento t alla fine del vettore v.pop_back() (void) : elimina l ultimo elemento inserito nel vettore v.front() (T &) : ritorna il primo elemento v.back() (T &) : ritorna l ultimo elemento v.[i] (T &) : accede all elemento i v.at(i) (T &) : accede all elemento i (e contolla che i non superi i limiti degli indici dell array - bound checking) Array dinamico // definiamo il puntatore all array double ** matrix = NULL; // Allochiamo memoria per le righe matrix = new double *[ROWS]; // e per le colonne for (int i=0; i< ROWS; i++) matrix[i] = new double[cols]; // Una volta terminato, liberiamo la memoria for (int i=0; i< ROWS; i++) delete [] matrix[i]; delete [] matrix;

Array dinamico generico con i template template <type T> T ** creaarray(int righe, int colonne) T ** matrix; matrix = new T *[righe]; for (int i=0; i< righe; i++) matrix[i] = new T[colonne]; return matrix; template <type T> void freearray(t ** matrix) delete [] * matrix; delete [] matrix; double ** A = creaarray<double>(4,4); A[0][0] = 3.1415; A[1][1] = 3.1415/2.0; cout << A[0][0] << A[1][1] << endl; freearray<double>(a);