• Non ci sono risultati.

Collezioni e flussi di dati C++

N/A
N/A
Protected

Academic year: 2022

Condividi "Collezioni e flussi di dati C++"

Copied!
27
0
0

Testo completo

(1)

lo Fondamenti di informaticalo Fondamenti di informatica eria dell'informazione UniPReria dell'informazione UniPR e.unipr.it/people/tomamic/e.unipr.it/people/tomamic/

Collezioni e flussi di dati C++

Fondamenti di informatica

Michele Tomaiuolo

tomamic@ce.unipr.it

(2)

. Tomaiuolo Fondamenti di informaticaM. Tomaiuolo Fondamenti di informatica ip. Ingegneria dell'informazione UniPRDip. Ingegneria dell'informazione UniPR ttp://www.ce.unipr.it/people/tomamic/http://www.ce.unipr.it/people/tomamic/

Sequenza di elementi dello stesso tipo

Ha un nome che lo identifica ed una lunghezza I singoli elementi nel vector vengono identificati tramite un indice numerico

31 28 31 monthLength[0]

monthLength[1]

monthLength[2]

monthLength

Nome vector Nome vector

Contenuto Contenuto Indice, da 0 a size-1

Indice, da 0 a size-1 ...

Vector

(3)

lo Fondamenti di informaticalo Fondamenti di informatica eria dell'informazione UniPReria dell'informazione UniPR e.unipr.it/people/tomamic/e.unipr.it/people/tomamic/

vector<Type> vectorName(size, val) Si specifica il tipo e il numero degli elementi

#include <vector>

Valore iniziale di tutti gli elementi: opzionale

Indice: da 0 a size – 1

Nessun controllo automatico!

Né in compilazione, né in esecuzione

Dichiarazione vector

(4)

. Tomaiuolo Fondamenti di informaticaM. Tomaiuolo Fondamenti di informatica ip. Ingegneria dell'informazione UniPRDip. Ingegneria dell'informazione UniPR ttp://www.ce.unipr.it/people/tomamic/http://www.ce.unipr.it/people/tomamic/

Accesso agli elementi

Dimensione attuale del vector

vector<int> monthLength(12);

int months = monthLenght.size(); // 12

Accesso e modifica degli elementi

Nome del vector seguito dall’indice (expr), racchiuso tra parentesi quadre

int aprilLength = monthLength[3];

monthLength[4] = mayLength;

Controllo indice:

monthLength[i]

monthLength.at(i) Controllo indice:

monthLength[i]

monthLength.at(i)

(5)

lo Fondamenti di informaticalo Fondamenti di informatica eria dell'informazione UniPReria dell'informazione UniPR e.unipr.it/people/tomamic/e.unipr.it/people/tomamic/

int size, i;

cout << "Size: ";

cin >> size; // init size before creating the vector!

vector<int> values(size);

// read values

for (i = 0; i < values.size(); ++i) { cout << "Insert value: ";

cin >> values[i];

}

// write values, in reverse order

for (i = values.size() - 1; i >= 0; --i) { cout << values[i];

}

Inversione vector

(6)

. Tomaiuolo Fondamenti di informaticaM. Tomaiuolo Fondamenti di informatica ip. Ingegneria dell'informazione UniPRDip. Ingegneria dell'informazione UniPR ttp://www.ce.unipr.it/people/tomamic/http://www.ce.unipr.it/people/tomamic/

Ridimensionamento

Aggiungere elemento in fondo

std::vector<string> names(5, "");

names.push_back("ada"); // size = 6 La dimensione risulta incrementata di 1

Inserire o rimuovere un elemento ad un certo indice

names.insert(names.begin() + 2, "jean");

names.erase(names.begin() + 4);

Eventuali elementi successivi scorrono La dimensione aumenta o diminuisce di 1

Riassegnamento o cancellazione

names.assign(newSize, newVal);

names.clear(); // assign(0)

(7)

lo Fondamenti di informaticalo Fondamenti di informatica eria dell'informazione UniPReria dell'informazione UniPR e.unipr.it/people/tomamic/e.unipr.it/people/tomamic/

#include <vector>

int main() { int val, i;

vector<int> values;

cout << "Insert a sequence of values (0 to end): ";

cin >> val;

while (val != 0) {

values.push_back(val);

cin >> val;

}

for (i = values.size() - 1; i >= 0; --i) { cout << values[i] << endl;

Aggiunta elementi ed inversione

(8)

. Tomaiuolo Fondamenti di informaticaM. Tomaiuolo Fondamenti di informatica ip. Ingegneria dell'informazione UniPRDip. Ingegneria dell'informazione UniPR ttp://www.ce.unipr.it/people/tomamic/http://www.ce.unipr.it/people/tomamic/

Vector multidimensionali

vector< vector<Type> >

name(rows, vector<Type>(cols, val))

Vector di vector di...

Accesso agli elementi: due o più indici (o dimensioni) Se bidimensionali, denominati matrici

a = {3, 4, 8, 1, 2, 7}; // 1D b = {{3, 4, 8},

{1, 2, 7}}; // 2D

y = i / cols; x = i % cols; // 1D -> 2D i = y * cols + x; // 2D -> 1D

(9)

lo Fondamenti di informaticalo Fondamenti di informatica eria dell'informazione UniPReria dell'informazione UniPR e.unipr.it/people/tomamic/e.unipr.it/people/tomamic/

int rows, cols, x, y, sum; cin >> rows >> cols;

vector< vector<int> > matrix(rows, vector<int>(cols, 0));

for (y = 0; y < rows; ++y) { for (x = 0; x < cols; ++x) {

cout << "Elem #" << y << "," << x << ": ";

cin >> matrix[y][x];

} }

for (y = 0; y < rows; ++y) { sum = 0;

for (x = 0; x < cols; ++x) { sum += matrix[y][x];

}

cout << "Row #" << y << " sums to " << sum << endl;

Somma righe in matrice

(10)

. Tomaiuolo Fondamenti di informaticaM. Tomaiuolo Fondamenti di informatica ip. Ingegneria dell'informazione UniPRDip. Ingegneria dell'informazione UniPR ttp://www.ce.unipr.it/people/tomamic/http://www.ce.unipr.it/people/tomamic/

int rows, cols, x, y, sum; cin >> rows >> cols;

vector<int> matrix(rows * cols, 0);

for (y = 0; y < rows; ++y) { for (x = 0; x < cols; ++x) {

cout << "Elem #" << y << "," << x << ": ";

cin >> matrix[y * cols + x];

} }

for (y = 0; y < rows; ++y) { sum = 0;

for (x = 0; x < cols; ++x) { sum += matrix[y * cols + x];

}

cout << "Row #" << y << " sums to " << sum << endl;

}

Vector pseudo-multidimensionale

(11)

lo Fondamenti di informaticalo Fondamenti di informatica eria dell'informazione UniPReria dell'informazione UniPR e.unipr.it/people/tomamic/e.unipr.it/people/tomamic/

Map

Vector per indicizzare informazioni

… ma richiedono un indice intero

Gli array associativi (o mappe, dizionari ecc.) permettono di usare altri tipi come indice

#include <map>

map<string, int> ages;

Attenzione, l'indice non è (necessariamente) un intero progressivo

Occorre conoscere gli indici (chiavi) da leggere

Scorrere intera mappa richiede un iteratore

(12)

. Tomaiuolo Fondamenti di informaticaM. Tomaiuolo Fondamenti di informatica ip. Ingegneria dell'informazione UniPRDip. Ingegneria dell'informazione UniPR ttp://www.ce.unipr.it/people/tomamic/http://www.ce.unipr.it/people/tomamic/

Map

Operatore [] per accesso come vector

int tomAge = ages["tom"];

ages["john"] = 25;

Se l'elemento non esiste ancora, viene creato Altrimenti viene modificato il valore esistente

Controllare una chiave, rimuovere un elemento, o tutti

names.count("tom"); // 0 or 1 names.erase("tom");

names.clear();

(13)

lo Fondamenti di informaticalo Fondamenti di informatica eria dell'informazione UniPReria dell'informazione UniPR e.unipr.it/people/tomamic/e.unipr.it/people/tomamic/

map<string, int> wordCounts;

string word;

cin >> word;

while (word != "end") {

int count = wordCounts[word]; // get old value, or 0 wordCounts[word] = count + 1; // store new value

// ++wordCounts[word];

cin >> word;

}

cin >> word;

while (word != "end") {

cout << wordCounts[word] << endl;

cin >> word;

Conteggio parole ripetute

(14)

. Tomaiuolo Fondamenti di informaticaM. Tomaiuolo Fondamenti di informatica ip. Ingegneria dell'informazione UniPRDip. Ingegneria dell'informazione UniPR ttp://www.ce.unipr.it/people/tomamic/http://www.ce.unipr.it/people/tomamic/

File (o archivio): insieme di dati memorizzati su memoria di massa; operazioni di lettura o scrittura Stream: astrazione per flussi di informazione

Gestione file simile a cin e cout

File di testo (varie codifiche possibili)

Possibili alcune conversioni automatiche Es. ritorno a capo "\n" → "\r\n"

File binari (qualsiasi file... anche di testo!)

I/O preciso byte a byte: nessuna conversione

Operazioni su file

(15)

lo Fondamenti di informaticalo Fondamenti di informatica eria dell'informazione UniPReria dell'informazione UniPR e.unipr.it/people/tomamic/e.unipr.it/people/tomamic/

Qualunque dispositivo I/O visto come “stream”

Lettura o scrittura di informazioni

cin : flusso standard di input dei dati (tastiera) cout : flusso standard di output (monitor)

cerr : flusso standard dei messaggi di errore clog : flusso standard dei messaggi di log

Default: cout, cerr e clog diretti su console

Console come stream

(16)

. Tomaiuolo Fondamenti di informaticaM. Tomaiuolo Fondamenti di informatica ip. Ingegneria dell'informazione UniPRDip. Ingegneria dell'informazione UniPR ttp://www.ce.unipr.it/people/tomamic/http://www.ce.unipr.it/people/tomamic/

<sstream>

<fstream>

Tipi di flussi

ios_base ios_base

iosios

ostream

ostream istreamistream

ofstream ofstream

ostringstream

ostringstream istringstreamistringstream ifstream

ifstream iostream

iostream

fstream fstream

stringstream stringstream

cout, cerr, clog

cout, cerr, clog cincin

(17)

lo Fondamenti di informaticalo Fondamenti di informatica eria dell'informazione UniPReria dell'informazione UniPR e.unipr.it/people/tomamic/e.unipr.it/people/tomamic/

Scrittura su file

Operatore di inserimento, come cout

#include <fstream>

ofstream out("test.txt");

out << name << ' ' << age << endl;

out << letter;

Chiusura stream (di lettura o scrittura)

out.close();

Controllo errori su stream (di lettura o scrittura)

if (out.good()) { /* … */ };

In alternativa: errori gestiti come eccezioni

(18)

. Tomaiuolo Fondamenti di informaticaM. Tomaiuolo Fondamenti di informatica ip. Ingegneria dell'informazione UniPRDip. Ingegneria dell'informazione UniPR ttp://www.ce.unipr.it/people/tomamic/http://www.ce.unipr.it/people/tomamic/

string line;

ofstream out("example.txt");

getline(cin, line);

while (cin.good()) { out << line << endl;

getline(cin, line);

}

// while (getline(cin, line)) { // out << line << endl;

// }

out.close();

Scrittura righe in file

L'utente può chiudere cin:

CTRL+Z (Windows) CTRL+D (Unix) L'utente può chiudere cin:

CTRL+Z (Windows) CTRL+D (Unix)

Se errore o eof, stream valutato

come false Se errore o eof, stream valutato

come false Valore di ritorno

di getline: lo stream stesso Valore di ritorno

di getline: lo stream stesso

(19)

lo Fondamenti di informaticalo Fondamenti di informatica eria dell'informazione UniPReria dell'informazione UniPR e.unipr.it/people/tomamic/e.unipr.it/people/tomamic/

Lettura da file

Operatore di estrazione, come cin

#include <fstream>

ifstream in("test.txt");

in >> name >> age; // string, int, char...

Controllo disponibilità dati

in >> x; // x: string, int, char...

while (in.good()) {

/* your code here */

in >> x;

}

while (in >> x) { // equivalent to above

(20)

. Tomaiuolo Fondamenti di informaticaM. Tomaiuolo Fondamenti di informatica ip. Ingegneria dell'informazione UniPRDip. Ingegneria dell'informazione UniPR ttp://www.ce.unipr.it/people/tomamic/http://www.ce.unipr.it/people/tomamic/

string line;

ifstream in("example.txt");

getline(in, line);

while (in.good()) {

cout << line << endl;

getline(in, line);

}

// while (getline(in, line, '\n')) { // cout << line << endl;

// }

in.close();

Lettura righe da file

Nessun errore, né già trovato

eof (fine file) Nessun errore,

né già trovato eof (fine file)

3° parametro opz.:

carattere delimitatore (default = '\n') 3° parametro opz.:

carattere delimitatore (default = '\n')

(21)

lo Fondamenti di informaticalo Fondamenti di informatica eria dell'informazione UniPReria dell'informazione UniPR e.unipr.it/people/tomamic/e.unipr.it/people/tomamic/

Manipolatori

Elementi che possono essere inviati in un flusso per modificarne il comportamento

endl – Ritorno a capo (e flush del buffer) setw(4) – Dimensione minima

left, right, fill('#') – Allineamento, riempim.

fixed, scientific, setprecision(2) – Notazione fissa o scientifica, numero decimali

hex, dec, oct – Base di numerazione

noskipws, skipws – Leggere (in una var. char) spazi,

tab ecc., oppure no

(22)

. Tomaiuolo Fondamenti di informaticaM. Tomaiuolo Fondamenti di informatica ip. Ingegneria dell'informazione UniPRDip. Ingegneria dell'informazione UniPR ttp://www.ce.unipr.it/people/tomamic/http://www.ce.unipr.it/people/tomamic/

ifstream in("src.dat", ios::binary);

ofstream out("dst.dat", ios::binary);

if (in.good() && out.good()) { in >> noskipws;

char c;

while (in >> c) { out << c;

} }

in.close();

out.close();

Copia file binario

Nessuna conversione, es.

“\n” ↔ “\r\n”

Nessuna conversione, es.

“\n” ↔ “\r\n”

Leggiamo anche spazi, tab

e a-capo Leggiamo anche spazi, tab

e a-capo

In alternativa:

errori gestiti come eccezioni In alternativa:

errori gestiti come eccezioni

Riferimenti

Documenti correlati

aiuolo – Fondamenti di informaticaaiuolo – Fondamenti di informatica egneria dell'informazione – UniPR egneria dell'informazione –

Fondamenti di informatica Fondamenti di informatica dell'informazione – UniPR dell'informazione – UniPR unipr.it/people/tomamic/unipr.it/people/tomamic/.. Caratteristiche

Input space: building P using probability distributions so that picking two similar points is much more probable than picking two points which are well far apart.. Output

In questa lezione si continua la descrizione degli elementi di base utilizzati a livello RTL.. Si discute la suddivisione fra percorso dati e unità

• Una variabile è un ente, appartenente ad un certo tipo, che può assumere uno qualunque dei valori appartenenti al tipo. • Una variabile è identificata da un

Un utente locale è definito solo in uno specifico computer, quindi non può accedere ad altri computer. Un utente globale è definito per tutti i computer della stessa

Nazionale per l'informatica Consorzio Interuniversitario (art.91 DPR 283/1980) (Organismo di diritto pubblico con personalità giuridica di diritto privato soggetto a

In generale, per qualunque impiego di MOGM in Ateneo, gli operatori devono essere forniti di dispositivi di protezione individuale (DPI), l’accesso deve essere controllato, deve