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
. 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
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
. 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)
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
. 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)
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
. 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
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
. 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
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
. 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();
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
. 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
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
. 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
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
. 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
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
. 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')
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
. 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